ios 为什么“成为第一React者”不起作用?

332nm8kg  于 2023-02-06  发布在  iOS
关注(0)|答案(3)|浏览(135)

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

bn31dyow

bn31dyow1#

第一种方法和第二种方法之间有一个差异。
根据performSelector:withObject:afterDelay:delay参数
消息发送之前的最短时间。指定延迟为0不一定会立即执行选择器。选择器仍在线程的运行循环中排队,并尽快执行。
第二种方法将等到适当的时间再执行becomeFirstResponder

iszxjhcz

iszxjhcz2#

呼叫成为第一响应者,如下所示,也许它对你也有效,因为它确实对我有效

[textView performSelector:@selector(becomeFirstResponder) withObject:nil afterDelay:0];
lf5gs5x2

lf5gs5x23#

似乎在iOS7中,视图/对象还没有被附加到视图层次结构/窗口中。所以在对象上调用方法失败。如果我们放置了一些延迟,它正在工作,这意味着在那一刻对象被附加到窗口中。
根据苹果的说法,
仅当当前响应者可以放弃第一响应者状态(canResignFirstResponder)并且新响应者可以成为第一响应者时,响应者对象才成为第一响应者。
可以调用此方法使响应方对象(如视图)成为第一响应方。但是,只有当该视图是视图层次结构的一部分时,才应在该视图上调用此方法。如果视图的window属性包含UIWindow对象,则该对象已安装在视图层次结构中;如果返回nil,则视图将从任何层次结构中分离。
有关更多详细信息,请参见UIResponder类参考。

相关问题