解決
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
同じメソッドにあります。つまり、両方とも同じウィンドウにあるということです。カスタム ビュー コントローラーをどのように提示しても(したがって) も含まれます。が呼び出されるまでに設定されますが、それでは遅すぎます。その時までに、ナビゲーション コントローラーはビューを画面にプッシュするアニメーションを既に完了しているからです。_textView
self.view
self.view.window
_textView.window
nil
initWithNibName:bundle:
self.view.window
viewDidAppear:
self.view.window
viewWillLayoutSubviews
また、またはviewDidLayoutSubviews
が呼び出されるまでに設定され、これらのメソッドは、ナビゲーション コントローラーのプッシュ アニメーションが開始する前に呼び出されます。そのため、これらの方法のいずれかで実行すると機能します。
残念ながら、最初のナビゲーション コントローラーのプッシュ以外にも多くの呼び出しが行われますviewWillLayoutSubviews
。viewDidLayoutSubviews
しかし、navigationController:willShowViewController:
呼び出さwillMoveToParentViewController:
れるのが早すぎる (設定後、設定viewDidLoad
前self.view.window
) とnavigationController:didShowViewController:
、didMoveToParentViewController:
呼び出されるのが遅すぎる (プッシュ アニメーションの後)。
私が考えることができる唯一の他の方法は、プロパティが変更されたときに通知されるように何らかの形でwindow
プロパティを観察することですが、それを行う方法はわかりません._textView
window
readonly