ピッカーの上に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でも、同じ問題が発生し続けます。
私は何をしますか?
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;
IOS 8の場合self.viewにUIPickerViewが追加されている場合:
[self.view addSubview:piker];
コードからこの行を削除してから、次のように設定してください。
textField.inputView = piker;
ありがとう
UIDatePickerViewは、スーパービューの子クラスであってはなりません
問題:
InputViewまたはinputAccessoryViewに割り当てるビューが、どの親ビューにも属していないことを確認する必要があります。たぶん、ViewController内のxibからこれらのビューを作成するとき、デフォルトでは、それらはスーパービューのサブビューです。
解決策のヒント:
ビューにメソッドremoveFromSuperviewを使用して、inputViewまたはinputAccessoryViewに割り当てます
私もこの問題に遭遇しました。私のコードにはaddSubViewがありませんでしたが、xibには別のUIViewを含むUIViewがあります。内部のUIViewには、次のようにUIViewプロパティへのアウトレットがありました。
@property(nonatomic, strong) IBOutlet UIView *inputView;
それを解決したのは、xibを開き、「ファイルの所有者」(黄色の立方体アイコン)を右クリックして、ビューとアウトレットのリストを開き、右側の円のチェックを外してリンクを削除することでした。
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;
...
}