我使用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
手动发送消息,则可以正常使用。为什么这个方法直到运行时才确定?
答案 0 :(得分:7)
在iOS7中看起来似乎未在视图层次/窗口中附加视图/对象。因此对象的调用方法失败。如果我们放一些延迟并且它工作就意味着那时对象被附加到窗口。
根据Apple,
如果当前,响应者对象只成为第一个响应者 响应者可以辞退第一响应者状态(canResignFirstResponder) 并且新的响应者可以成为第一响应者。
您可以调用此方法来制作响应者对象,例如查看 急救人员。但是,您应该只在该视图上调用它 是视图层次结构的一部分。如果视图的窗口属性包含 UIWindow对象,它已安装在视图层次结构中;如果它 返回nil,视图与任何层次结构分离。
有关详细信息,请参阅UIResponder Class Reference。
答案 1 :(得分:0)
第一种和第二种方法之间存在大差异。
根据delay
performSelector:withObject:afterDelay:
参数
发送邮件的最短时间。指定延迟0不一定会导致选择器立即执行。选择器仍然在线程的运行循环中排队,并尽快执行。
第二种方法将等到适当的时间并执行becomeFirstResponder
。