由于未捕获exception“UIViewControllerHierarchyInconsistency”而终止应用程序,

我在两个button的select器上方创build了一个工具栏,并在ios7上运行,当我在ios8崩溃中运行时:

终止应用程序二未捕获的exception“UIViewControllerHierarchyInconsistency”,原因:“子视图控制器:应该有父视图控制器:但要求的父母是:”

这是在ios7中安静地工作的一段代码:

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; 

你知道我意识到inputAccessoryView会崩溃的应用程序,我也问苹果的工程师,他们告诉我,这是testing版的问题,但现在与通用汽车继续给出同样的问题。

我该怎么办?

我在iOS 8上遇到了同样的exception,现在修改为以下代码。

重点是,你不应该添加一个input视图作为视图控制器视图的子视图。 (我不知道为什么iOS 7中的代码运行良好,在iOS 8中不再适用)

之前(发生错误)

 UITextField* someTF; View* customView; UIViewController *mainVC; [mainVC.view addSubview:customView]; someTF.inputView = customView; 

(工作正常)

 UITextField* someTF; View* customView; UIViewController *mainVC; // [mainVC.view addSubview:customView]; <-- delete this line someTF.inputView = customView; 

对于ios 8如果您在self.view上添加了UIPickerView:

 [self.view addSubview:piker]; 

请从您的代码中删除此行,然后设置:

 textField.inputView = piker; 

谢谢

UIDatePickerView不应该是任何超级视图的子级

问题

您必须确保您分配给inputView或inputAccessoryView的视图不属于任何父视图。 也许当你从一个ViewController里面的xib创build这些视图的时候,默认情况下他们是一个superview的子视图。

解决scheme提示

使用方法removeFromSuperview查看您将分配给inputView或inputAccessoryView

请参阅此链接的详细信息

将input视图添加到文本框iOS 8时出错

当我尝试在我的UITextField中设置我的UIDatePicker时,我遇到了同样的问题

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

我的解决scheme,我只是“分配”和“初始化”我的datePicker在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; ... } 

我也遇到了这个问题。 我的代码没有任何addSubView,但我的xib有一个UIView与另一个UIView里面。 里面的UIView有一个UIView属性的sockets,如下所示:

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

解决的办法是打开xib,右键点击“文件所有者”(黄色的立方体图标),打开视图和网点列表,并通过取消勾选右边的圆圈来删除链接。