ma1*_*w28 17
在iOS系统7,要求becomeFirstResponder对_textView在viewDidLayoutSubviews工作.
- (void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
[_textView becomeFirstResponder];
}
Run Code Online (Sandbox Code Playgroud)
注意:执行此操作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.
tit*_*coy 11
您需要做的就是告诉有问题的文本视图成为viewDidLoad您正在推送到导航堆栈的视图控制器方法中的第一个响应者:
override func viewDidLoad() {
super.viewDidLoad()
someTextView.becomeFirstResponder()
}
Run Code Online (Sandbox Code Playgroud)
这适用于iOS 8.键盘从右侧滑入视图.