由于未捕获的异常'UIViewControllerHierarchyInconsistency'而终止应用,

时间:2014-09-10 09:33:49

标签: ios uipickerview inputaccessoryview

我在选择器上方创建了一个带有两个按钮的工具栏并在ios7上工作,当我在ios8崩溃中运行时:

  

将app 2终止为未捕获的异常   ' 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会让应用程序崩溃,我也问苹果公司的工程师他们告诉我这是测试版的问题,但现在通用汽车继续给予同样的问题。

我该怎么办?

5 个答案:

答案 0 :(得分:14)

我在iOS 8上遇到了同样的例外,现在修复了以下代码。

关键是,您不应将输入视图添加为视图控制器视图的子视图。 (我不知道为什么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;

答案 1 :(得分:5)

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

[self.view addSubview:piker];

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

textField.inputView = piker;

谢谢

答案 2 :(得分:2)

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

<强>问题

您必须确保您将分配给inputView或inputAccessoryView的视图不属于任何父视图。也许当您在ViewController中从xib创建这些视图时,默认情况下它们是superview的子视图。

解决方案提示

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

答案 3 :(得分:0)

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

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

我的解决方案,我只是&#34;分配&#34;和&#34; init&#34;我在ViewDidLoad中的datePicker

- (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;
    ...
}

答案 4 :(得分:0)

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

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

解决问题的方法是打开xib,右键单击&#34;文件的所有者&#34; (黄色立方体图标),用于打开视图和插座列表,并通过取消选中右侧的圆圈来删除链接。