解決
iOS 7 では、呼び出しbecomeFirstResponderが機能_textViewしviewDidLayoutSubviewsます。
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
[_textView becomeFirstResponder];
}
注: で実行することviewWillLayoutSubviewsもできます。
説明
becomeFirstResponderのドキュメントの議論を読んでください。
このメソッドを呼び出して、ビューなどのレスポンダー オブジェクトをファーストレスポンダーにすることができます。ただし、ビュー階層の一部である場合にのみ、そのビューで呼び出す必要があります。ビューのwindowプロパティがUIWindowオブジェクトを保持している場合、そのオブジェクトはビュー階層にインストールされています。が返された場合nil、ビューは階層から切り離されています。
ナビゲーション コントローラーを使用してカスタム ビュー コントローラーを画面上にプッシュする場合、self.view.windowまだ呼び出さnilれているかviewDidLoad、viewWillAppear:呼び出されています。は のサブビューなので、_textView.windowもnil同じメソッドにあります。つまり、両方とも同じウィンドウにあるということです。カスタム ビュー コントローラーをどのように提示しても(したがって) も含まれます。が呼び出されるまでに設定されますが、それでは遅すぎます。その時までに、ナビゲーション コントローラーはビューを画面にプッシュするアニメーションを既に完了しているからです。_textViewself.viewself.view.window_textView.windownilinitWithNibName:bundle:self.view.windowviewDidAppear:
self.view.windowviewWillLayoutSubviewsまた、またはviewDidLayoutSubviewsが呼び出されるまでに設定され、これらのメソッドは、ナビゲーション コントローラーのプッシュ アニメーションが開始する前に呼び出されます。そのため、これらの方法のいずれかで実行すると機能します。
残念ながら、最初のナビゲーション コントローラーのプッシュ以外にも多くの呼び出しが行われますviewWillLayoutSubviews。viewDidLayoutSubviewsしかし、navigationController:willShowViewController:呼び出さwillMoveToParentViewController:れるのが早すぎる (設定後、設定viewDidLoad前self.view.window) とnavigationController:didShowViewController:、didMoveToParentViewController:呼び出されるのが遅すぎる (プッシュ アニメーションの後)。
私が考えることができる唯一の他の方法は、プロパティが変更されたときに通知されるように何らかの形でwindowプロパティを観察することですが、それを行う方法はわかりません._textViewwindowreadonly