web-dev-qa-db-ja.com

テキストビューiOS 8に入力ビューを追加する際のエラー

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です。

62
Milo

以前にこの問題に遭遇しました。

問題

  • inputViewまたはinputAccessoryViewに割り当てるビューがどの親ビューにも属さないようにする必要があります。 ViewController内のxibからこれらのビューを作成すると、デフォルトでスーパービューのサブビューとして設定されます。

ソリューションのヒント

  • removeFromSuperviewまたはinputViewに割り当てるビューでinputAccessoryViewメソッドを使用します
111
Tuyen Nguyen

becomeFirstResponderの直前で、スーパービューから入力に使用するビューを削除します。

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

それが役に立てば幸い。

18
Rudi

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;
}
3
pkamb

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

溶液:

命名を確認してください。不要な場合はオーバーライドしないでください。

2
Octav

私はそれを考え出した。以前は問題が何だったのかはわかりませんが、インターフェイスビルダーでUIViewをリンクする代わりに、プログラムでUIViewを作成し、正常に機能しました。

2
Milo

ええ、Tuyen Nguyenのソリューションはうまくいきませんでした。 inputAccessoryViewを設定するためにiOS 8/Xcode 6で機能したのは、removeFromSuperviewではなく、代わりに:

[[UIApplication sharedApplication].keyWindow addSubview:**MyViewToBeTheUIAccessoryView**];

これが誰かの役に立つことを願っています。

1
Sasho

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
    ...
}
1
J. Lopes

プログラムでUIViewを作成するソリューションを見つけました(Miloが提案したように)が、@ propertyのように使用するとクラッシュします。私の場合、viewDidLoadでUIPickerViewインスタンスを作成し、UITextView inputViewに割り当てる必要がありました。 pickerViewにアクセスする必要があるときは、次のようになります

UIPickerView *picker = (UIPickerView *)self.myTextField.inputView;
1
Lucio Fonseca

removeFromSuperViewviewDidLoadを呼び出すと、モーダルで適切に動作しないようです。ビューを非表示に設定し、viewDidAppearのsuperViewから削除しました。

0
aryaxt

この問題の私の解決策は、viewViewをinputViewに追加することでしたが、View Controllerを親に追加することではありませんでした。

0
slobodans

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

0
Adam Mendoza

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

0
ChikabuZ