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

Rav*_*avi 22 cocoa-touch objective-c uitextfield first-responder ios

我添加了一个模态使用AGWindowView.在模态视图内部(使用IB构建),有一个文本字段.文本字段已连接到插座.

这不起作用:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self.placesTextField becomeFirstResponder];
}
Run Code Online (Sandbox Code Playgroud)

呼叫becomeFirstResponder不起作用,键盘不显示.

这有效:

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self.placesTextField performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0];
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我手动发送消息使用performSelector:withObject:afterDelay它工作.为什么这个方法直到运行时才被确定?

βha*_*avḯ 7

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

按照Apple,

如果当前响应者可以辞退第一响应者状态(canResignFirstResponder)并且新响应者可以成为第一响应者,则响应者对象仅成为第一响应者.

您可以调用此方法来创建响应者对象,例如查看第一响应者.但是,如果它是视图层次结构的一部分,则只应在该视图上调用它.如果视图的window属性包含UIWindow对象,则它已安装在视图层次结构中; 如果它返回nil,则视图将从任何层次结构中分离.

有关更多详细信息,请参阅UIResponder类参考.