becomeFirstResponder工作在viewDidAppear但在viewDidLoad中

2019-08-17 17:13发布

我的应用程序有一个模式视图控制器,包括一个搜索栏。 当视图来了,我想集中搜索栏。 我试过[self.searchBar becomeFirstResponder]viewDidLoad ,但没有奏效。 后来我把它放在viewDidAppear ,它的工作。 但有了这个解决办法,有一个明显的延迟。 (后视图完全显现,键盘开始出现)

我可以保证双方viewDidAppearviewDidLoad被调用。

我应该怎么做,如果我想搜索栏瞬间的观点出现集中?

(我用故事板)

其次答案,我试图将代码放在viewWillLoad ,但仍然没有工作。 (在viewWillLoadself.searchBar.window为nil)

Answer 1:

也许它并不在viewDidLoad中工作,因为观点不加入视图层次呢。 但根据苹果文档becomeFirstResponder只应在连接到一个UIWindow对象叫:

However, you should only call it on that view if it is part of a view hierarchy. 
If the view’s window property holds a UIWindow object, it has been installed 
in a view hierarchy; if it returns nil, the view is detached from any hierarchy.

所以,我认为,要实现必要的行为,最好的地方是将调用到viewWillAppear的方法。

更新。

因此,在viewWillAppear中控制器的视图尚未连接到一个UIWindow ......它只是通知,该视图将被添加到视图层级

这可能是一些棘手的,但你可以在viewWillAppear中一些小的延迟:

 - (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    double delayInSeconds = 0.05;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^{ 
        make first responder here
    });
 }

但我相信这是应该是一个更好的解决方案



Answer 2:

所有IBOutlet中对象被加载在viewDidLoad中,如果要调用在viewDidLoad中的方法,那么该动作没有执行,因为之前的对象被加载,我们不能做任何事情,是whybetter编写代码

-(void)viewWillAppear:(BOOL)animated{
//write here
} 

然后正常工作。



Answer 3:

你应该在viewDidLayoutSubviews调用(),下面的代码设置文本框becomeFirstResponder仅在第一时间视图布局子视图,它应该是。

var isFirstLayout: Bool = true
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    if isFirstLayout {
        defer { isFirstLayout = false }
        textField.becomeFirstResponder()
    }
}


Answer 4:

这将帮助:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.quantifyTextField becomeFirstResponder];
    });
}


Answer 5:

使文本字段/查看第一个响应者都应该UIViewController的动画,当视图被加载并提出其发生之后进行。 所以,最好的地方是viewDidAppear。



Answer 6:

viewWillAppear的instad viewDidAppear/viewDidLoad

由于viewWillAppear的方法是调用在浏览时会出现( 过程 ),以获取更多信息有关viewWillAppear阅读本正式文件。

- (void)viewWillAppear:(BOOL)animated
{
    [self.searchBar becomeFirstResponder];
    [super viewWillAppear:animated];
}


Answer 7:

我知道这是一个有点老线,但我认为它可以帮助增加这个代码时所面临的一些问题,键盘的人。

请记住,文本字段委托设置在viewWillDisappear为零,否则键盘将不会再次,如果你弹出显示/关闭该视图控制器,无需关闭键盘。



文章来源: becomeFirstResponder works in viewDidAppear but doesn't work in viewDidLoad