web-dev-qa-db-fra.com

Arrêt de l'application en raison d'une exception non interceptée 'UIViewControllerHierarchyInconsistency',

J'ai créé une barre d'outils au-dessus du sélecteur avec deux boutons et travaillé sur ios7, lorsque je cours avec crash ios8:

Arrêt de l'application deux sur l'exception non interceptée 'UIViewControllerHierarchyInconsistency', motif: 'contrôleur de vue enfant: doit avoir le contrôleur de vue parent: mais le parent demandé est:'

C'est le morceau de code qui a fonctionné sans problème dans iOS 7

 expiredPromoTextField.inputView = DatePicker;
 expiredPromoTextField.delegate = self;
 quantityPromoTextField.inputView = quantityPicker;
 quantityPromoTextField.delegate = self;


 // Create button to close the UIPickerView
 UIToolbar * mypickerToolbar = [[UIToolbar alloc] initWithFrame: CGRectMake (0, 0, 320, 56)];
 mypickerToolbar.barStyle = UIBarStyleBlackTranslucent;
 [mypickerToolbar sizeToFit];
 NSMutableArray * barItems = [[NSMutableArray alloc] init];
 UIBarButtonItem * CancelBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemCancel target: self action:selector (cancelDoneClicked)];
 [barItems addObject: CancelBtn];
 UIBarButtonItem * FLEXspace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemFlexibleSpace target: self action: nil];
 [barItems addObject: FLEXspace];
 UIBarButtonItem * doneBtn = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemDone target: self action:selector (pickerDoneClicked :)];
 [barItems addObject: doneBtn];
 [mypickerToolbar setItems: barItems animated: YES];
 [quantityPicker setShowsSelectionIndicator: YES];

 expiredPromoTextField.inputAccessoryView = mypickerToolbar;
 quantityPromoTextField.inputAccessoryView = mypickerToolbar;

Vous savez que ce que j’ai réalisé c’est que inputAccessoryView va planter l’application. J’ai également demandé aux ingénieurs d’Apple de me dire que c’était un problème avec la version bêta, mais que maintenant avec le GM continue de donner le même problème.

Que fais-je?

12
Marco Giraudo

J'ai eu la même exception sur iOS 8 et maintenant fixé comme les codes suivants.

Le fait est que vous ne devez pas ajouter une vue d'entrée en tant que vue enfant de la vue du contrôleur de vue. (Je ne sais pas pourquoi le code a bien fonctionné sous iOS 7 ne fonctionne plus bien sous iOS 8.)

Avant (se produit une erreur)

UITextField* someTF;
View* customView;
UIViewController *mainVC;

[mainVC.view addSubview:customView];
someTF.inputView = customView;

Après (fonctionne bien)

UITextField* someTF;
View* customView;
UIViewController *mainVC;

//  [mainVC.view addSubview:customView];  <-- delete this line
someTF.inputView = customView;
13
Dale

Pour ios 8 Si vous avez ajouté UIPickerView sur self.view:

[self.view addSubview:piker];

Veuillez supprimer cette ligne de votre code, puis définissez:

textField.inputView = piker;

Merci

5
Jugal K Balara

UIDatePickerView ne doit pas être une classe enfant d'aucune super vue

Problème :

Vous devez vous assurer que la vue que vous allez affecter à inputView ou inputAccessoryView n'appartient à aucune vue parent. Peut-être que lorsque vous créez ces vues à partir de xib dans un ViewController, ce sont par défaut des sous-vues d'un superview.

Solution Tips :

Utilisation de la méthode removeFromSuperview pour la vue à affecter à inputView ou inputAccessoryView

2
umairhhhs

J'ai rencontré ce problème aussi. Mon code n'avait aucun addSubView mais mon xib a un UIView avec un autre UIView à l'intérieur. UIView inside possédait un point de vente vers une propriété UIView, à savoir:

@property(nonatomic, strong) IBOutlet    UIView *inputView;

Pour résoudre le problème, ouvrez le fichier xib, cliquez avec le bouton droit de la souris sur le "Propriétaire du fichier" (icône de cube jaune) qui ouvre la liste des points de vue et des prises et supprime le lien en décochant le cercle à droite.

0
Adam Mendoza

J'ai eu le même problème quand j'ai essayé de configurer mon UIDatePicker dans mon UITextField

- (void)setupViews {
    ...
    dobField.inputView = aDatePicker; // Here was the problem
    ...
}

Ma solution, je viens "d'allouer" et "init" mon datePicker dans ViewDidLoad

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    ...
    aDatePicker = [[UIDatePicker alloc] init]; // My solution
    // If you need UIDatePickerModeDate
    aDatePicker.datePickerMode = UIDatePickerModeDate;
    ...
}
0
J. Lopes