15

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

终止应用程序二未捕获的异常'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会导致应用程序崩溃,我还询问了 Apple 的工程师,他们告诉我这是 beta 版的问题,但现在 GM 继续给出同样的问题。

我该怎么办?

4

5 回答 5

15

我在 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;
于 2014-09-14T08:12:47.787 回答
6

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

[self.view addSubview:piker];

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

textField.inputView = piker;

谢谢

于 2014-09-23T09:23:45.210 回答
2

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

问题

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

解决方案提示

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

于 2015-02-18T07:12:00.543 回答
0

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

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

我的解决方案,我只是在 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;
    ...
}
于 2014-09-30T15:12:14.263 回答
0

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

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

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

于 2016-10-14T07:20:33.440 回答