web-dev-qa-db-ja.com

キャッチされなかった例外「UIViewControllerHierarchyInconsistency」が原因でアプリを終了しています。

ピッカーの上に2つのボタンがあるツールバーを作成し、ios8クラッシュで実行したときにios7で作業しました。

アプリ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がアプリをクラッシュさせることに気付いたのですが、エンジニアにApple)と聞いたところ、ベータ版の問題だと言われましたが、今はGMでも、同じ問題が発生し続けます。

私は何をしますか?

15
Marco Giraudo

IOS 8でも同じ例外があり、次のコードとして修正されました。

重要なのは、ビューコントローラのビューの子ビューとして入力ビューを追加しないことです。 (iOS7でコードがうまく機能した理由がiOS8でうまく機能しなくなった理由がわかりません。)

前(エラーが発生)

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;
14
Dale

IOS 8の場合self.viewにUIPickerViewが追加されている場合:

[self.view addSubview:piker];

コードからこの行を削除してから、次のように設定してください。

textField.inputView = piker;

ありがとう

5
Jugal K Balara

UIDatePickerViewは、スーパービューの子クラスであってはなりません

問題

InputViewまたはinputAccessoryViewに割り当てるビューが、どの親ビューにも属していないことを確認する必要があります。たぶん、ViewController内のxibからこれらのビューを作成するとき、デフォルトでは、それらはスーパービューのサブビューです。

解決策のヒント

ビューにメソッドremoveFromSuperviewを使用して、inputViewまたはinputAccessoryViewに割り当てます

2
umairhhhs

私もこの問題に遭遇しました。私のコードにはaddSubViewがありませんでしたが、xibには別のUIViewを含むUIViewがあります。内部のUIViewには、次のようにUIViewプロパティへのアウトレットがありました。

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

それを解決したのは、xibを開き、「ファイルの所有者」(黄色の立方体アイコン)を右クリックして、ビューとアウトレットのリストを開き、右側の円のチェックを外してリンクを削除することでした。

0
Adam Mendoza

UITextFieldでUIDatePickerを設定しようとしたときに、同じ問題が発生しました

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

私の解決策は、ViewDidLoadでdatePickerを「alloc」および「init」するだけです。

- (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