我使用AGWindowView
添加了一个模态视图,在模态视图(使用IB构建)中有一个文本字段,该文本字段已连接到插座。
这不起作用:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self.placesTextField becomeFirstResponder];
}
对becomeFirstResponder
的调用不起作用,键盘不显示。
此方法适用于:
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[self.placesTextField performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0];
}
但是,如果我使用performSelector:withObject:afterDelay
手动发送消息,它可以工作。为什么这个方法直到运行时才确定?
3条答案
按热度按时间bn31dyow1#
第一种方法和第二种方法之间有一个大差异。
根据
performSelector:withObject:afterDelay:
的delay
参数消息发送之前的最短时间。指定延迟为0不一定会立即执行选择器。选择器仍在线程的运行循环中排队,并尽快执行。
第二种方法将等到适当的时间再执行
becomeFirstResponder
。iszxjhcz2#
呼叫成为第一响应者,如下所示,也许它对你也有效,因为它确实对我有效
lf5gs5x23#
似乎在iOS7中,视图/对象还没有被附加到视图层次结构/窗口中。所以在对象上调用方法失败。如果我们放置了一些延迟,它正在工作,这意味着在那一刻对象被附加到窗口中。
根据苹果的说法,
仅当当前响应者可以放弃第一响应者状态(canResignFirstResponder)并且新响应者可以成为第一响应者时,响应者对象才成为第一响应者。
可以调用此方法使响应方对象(如视图)成为第一响应方。但是,只有当该视图是视图层次结构的一部分时,才应在该视图上调用此方法。如果视图的window属性包含UIWindow对象,则该对象已安装在视图层次结构中;如果返回nil,则视图将从任何层次结构中分离。
有关更多详细信息,请参见UIResponder类参考。