67

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 であるキーボード。

4

12 に答える 12

20

becomeFirstResponder入力に使用するビューをスーパービューから削除する直前に:

mTextField.inputView = mInputVeiw;
[mInputVeiw removeFromSuperview];
[mTextField becomeFirstResponder];

それが役に立てば幸い。

于 2014-09-22T06:58:06.207 に答える
3

割り当てるビュー、inputViewまたはinputAccessoryView親ビューに属していないことを確認する必要があります。

ストーリーボードで作成された (したがって VC に追加された) 「入力ビュー」は、またはこのクラッシュを引き起こさずviewに設定できないため、このエラーは特に厄介です。inputViewinputAccessoryView

入力ビューが VC に追加されていない場合、入力ビューはviewInterface Builder ストーリーボードでビジュアル編集できません。ストーリーボードの左ペインにのみ表示されます。

Xcode Storyboard の「Simulated Metrics」ツールバーを実際の IBOutlet UIToolbar に接続する方法は?

inputAccessoryViewストーリーボードで直接IB 接続を作成したいと思います。それがこのクラッシュを引き起こします。私が見つけた解決策は、ストーリーボードのビューに接続されたセカンダリ IBOutlet を作成し、それviewDidLoadをスーパー ビューから削除して、すぐに に割り当てることinputAccessoryViewです。これを最後まで使うかどうかはわかりません。

- (void)viewDidLoad {

    // ...

    [self.keybordView removeFromSuperview];
    self.inputAccessoryView = self.keybordView;
}
于 2015-05-28T01:34:58.500 に答える
2

私の問題は、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>'

解決:

命名を確認してください。必要がなければオーバーライドしないでください。

于 2017-06-11T22:18:55.297 に答える
1

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
    ...
}
于 2014-09-30T14:33:44.037 に答える
0

モーダルでは呼び出しremoveFromSuperViewviewDidLoad正しく機能していないようです。ビューを非表示に設定してから、viewDidAppear.

于 2015-03-08T17:30:05.540 に答える
0

私が行ったほとんどの回答は、コードの変更に関するものでした。メインビュー内のUIViewへのアウトレットを削除すると、それが修正されたことがわかりました。https://stackoverflow.com/a/40037236/464313

于 2016-10-14T07:23:38.323 に答える
0

この問題に対する私の解決策は、ビューをinputViewに追加することでしたが、ビューコントローラーを親に追加することではありませんでした。

于 2016-11-17T12:43:58.847 に答える
0

ストーリーボードから任意のビューを として返すと、同じエラーが発生しましたinputAccessoryView。childViewControllerで修正しました。ここで私の答えを見てください。

于 2017-05-27T16:44:32.643 に答える