IOS 8でカスタム入力ビューをアプリに追加すると問題が発生します。これはiOS 7では完全に機能していましたが、iOS 8に切り替えるとすべてが失敗します。
これはスタックトレースです。
2014-06-03 21:23:54.237 MyApp[1910:47245] *** Terminating app due to uncaught exception 'UIViewControllerHierarchyInconsistency', reason: 'child view controller:<UICompatibilityInputViewController: 0x1103f9d40>
should have parent view controller:<StopChooser: 0x11083e200> but requested parent is:<UIInputWindowController: 0x110858800>'
*** First throw call stack:
(
0 CoreFoundation 0x00000001042eee35 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x0000000103b919a0 objc_exception_throw + 45
2 CoreFoundation 0x00000001042eed6d +[NSException raise:format:] + 205
3 UIKit 0x00000001023d94cd -[UIViewController _addChildViewController:performHierarchyCheck:notifyWillMove:] + 184
4 UIKit 0x0000000102977a2b -[UIInputWindowController changeToInputViewSet:] + 416
5 UIKit 0x0000000102973f56 -[UIInputWindowController moveFromPlacement:toPlacement:starting:completion:] + 185
6 UIKit 0x000000010297826a -[UIInputWindowController setInputViewSet:] + 526
7 UIKit 0x0000000102973c97 -[UIInputWindowController performOperations:withAnimationStyle:] + 50
8 UIKit 0x00000001027559bb -[UIPeripheralHost(UIKitInternal) setInputViews:animationStyle:] + 1054
9 UIKit 0x0000000102422afd -[UIResponder becomeFirstResponder] + 468
10 UIKit 0x00000001023235d3 -[UIView(Hierarchy) becomeFirstResponder] + 99
11 UIKit 0x00000001029cdbfb -[UITextField becomeFirstResponder] + 51
12 UIKit 0x0000000102655d61 -[UITextInteractionAssistant(UITextInteractionAssistant_Internal) setFirstResponderIfNecessary] + 177
lib: terminating with uncaught exception of type NSException
(lldb)
関連する部分は、先頭の数行です。誰かがこれを説明できますか?私が呼んでいるのはmyTextview.inputView = keyboard
;キーボードは、ストーリーボードで作成され、IBOutletを介してリンクされたUIViewです。
以前にこの問題に遭遇しました。
問題:
inputView
またはinputAccessoryView
に割り当てるビューがどの親ビューにも属さないようにする必要があります。 ViewController内のxibからこれらのビューを作成すると、デフォルトでスーパービューのサブビューとして設定されます。ソリューションのヒント:
removeFromSuperview
またはinputView
に割り当てるビューでinputAccessoryView
メソッドを使用しますbecomeFirstResponder
の直前で、スーパービューから入力に使用するビューを削除します。
mTextField.inputView = mInputVeiw;
[mInputVeiw removeFromSuperview];
[mTextField becomeFirstResponder];
それが役に立てば幸い。
inputView
またはinputAccessoryView
に割り当てるビューが親ビューに属さないようにする必要があります。
このエラーは、ストーリーボードで作成された(したがってVCのview
に追加された)任意の「入力ビュー」をinputView
またはinputAccessoryView
として設定できないため、特に迷惑です。クラッシュ。
入力ビューがVCのview
に追加されない場合、入力ビューはInterface Builder Storyboardで視覚的に編集できません。ストーリーボードの左ペインにのみ表示されます。
Xcode Storyboardの「シミュレートされたメトリック」ツールバーを実際のIBOutlet UIToolbarに接続する方法
ストーリーボードでinputAccessoryView
に直接IB接続を作成したいと思います。それがこのクラッシュの原因です。私が見つけた解決策は、ストーリーボードのビューに接続されたセカンダリIBOutletを作成し、viewDidLoad
でスーパービューから削除し、すぐにinputAccessoryView
に割り当てます。これを使用してしまうかどうかはわかりません。
- (void)viewDidLoad {
// ...
[self.keybordView removeFromSuperview];
self.inputAccessoryView = self.keybordView;
}
私の問題は、textField「inputAccessoryView」を持つビューに名前を付けたことです...
@property (weak, nonatomic) IBOutlet CustomView *inputAccessoryView;
エラー:
Terminating app due to uncaught exception
'UIViewControllerHierarchyInconsistency', reason: 'child view
controller:<UICompatibilityInputViewController: 0x7fed7063a1a0> should
have parent view controller:<MyViewController: 0x7fed70606f00> but
requested parent is:<UIInputWindowController: 0x7fed710cde00>'
溶液:
命名を確認してください。不要な場合はオーバーライドしないでください。
私はそれを考え出した。以前は問題が何だったのかはわかりませんが、インターフェイスビルダーでUIView
をリンクする代わりに、プログラムでUIView
を作成し、正常に機能しました。
ええ、Tuyen Nguyenのソリューションはうまくいきませんでした。 inputAccessoryViewを設定するためにiOS 8/Xcode 6で機能したのは、removeFromSuperview
ではなく、代わりに:
[[UIApplication sharedApplication].keyWindow addSubview:**MyViewToBeTheUIAccessoryView**];
これが誰かの役に立つことを願っています。
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
...
}
プログラムでUIViewを作成するソリューションを見つけました(Miloが提案したように)が、@ propertyのように使用するとクラッシュします。私の場合、viewDidLoadでUIPickerViewインスタンスを作成し、UITextView inputViewに割り当てる必要がありました。 pickerViewにアクセスする必要があるときは、次のようになります
UIPickerView *picker = (UIPickerView *)self.myTextField.inputView;
removeFromSuperView
でviewDidLoad
を呼び出すと、モーダルで適切に動作しないようです。ビューを非表示に設定し、viewDidAppear
のsuperViewから削除しました。
この問題の私の解決策は、viewViewをinputViewに追加することでしたが、View Controllerを親に追加することではありませんでした。
私が答えたほとんどの回答は、コードの変更に関するものでした。メインビュー内のUIViewへのアウトレットを削除すると修正されることがわかりました。 https://stackoverflow.com/a/40037236/46431
ストーリーボードからビューをinputAccessoryView
として返すと、同じエラーが発生しました。 childViewControllerで修正しました。私の答えをご覧ください こちら 。