为什么成为第一个响应者不工作?

时间:2013-11-26 04:57:18

标签: ios objective-c cocoa-touch uitextfield first-responder

我使用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手动发送消息,则可以正常使用。为什么这个方法直到运行时才确定?

2 个答案:

答案 0 :(得分:7)

在iOS7中看起来似乎未在视图层次/窗口中附加视图/对象。因此对象的调用方法失败。如果我们放一些延迟并且它工作就意味着那时对象被附加到窗口。

根据Apple,

  

如果当前,响应者对象只成为第一个响应者   响应者可以辞退第一响应者状态(canResignFirstResponder)   并且新的响应者可以成为第一响应者。

     

您可以调用此方法来制作响应者对象,例如查看   急救人员。但是,您应该只在该视图上调用它   是视图层次结构的一部分。如果视图的窗口属性包含   UIWindow对象,它已安装在视图层次结构中;如果它   返回nil,视图与任何层次结构分离。

有关详细信息,请参阅UIResponder Class Reference

答案 1 :(得分:0)

第一种和第二种方法之间存在差异。

根据delay

performSelector:withObject:afterDelay:参数
  

发送邮件的最短时间。指定延迟0不一定会导致选择器立即执行。选择器仍然在线程的运行循环中排队,并尽快执行。

第二种方法将等到适当的时间并执行becomeFirstResponder