我的应用程序有一个模式视图控制器,包括一个搜索栏。 当视图来了,我想集中搜索栏。 我试过[self.searchBar becomeFirstResponder]
在viewDidLoad
,但没有奏效。 后来我把它放在viewDidAppear
,它的工作。 但有了这个解决办法,有一个明显的延迟。 (后视图完全显现,键盘开始出现)
我可以保证双方viewDidAppear
和viewDidLoad
被调用。
我应该怎么做,如果我想搜索栏瞬间的观点出现集中?
(我用故事板)
其次答案,我试图将代码放在viewWillLoad
,但仍然没有工作。 (在viewWillLoad
, self.searchBar.window
为nil)
也许它并不在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
});
}
但我相信这是应该是一个更好的解决方案
所有IBOutlet中对象被加载在viewDidLoad中,如果要调用在viewDidLoad中的方法,那么该动作没有执行,因为之前的对象被加载,我们不能做任何事情,是whybetter编写代码
-(void)viewWillAppear:(BOOL)animated{
//write here
}
然后正常工作。
你应该在viewDidLayoutSubviews调用(),下面的代码设置文本框becomeFirstResponder仅在第一时间视图布局子视图,它应该是。
var isFirstLayout: Bool = true
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
if isFirstLayout {
defer { isFirstLayout = false }
textField.becomeFirstResponder()
}
}
这将帮助:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
dispatch_async(dispatch_get_main_queue(), ^{
[self.quantifyTextField becomeFirstResponder];
});
}
使文本字段/查看第一个响应者都应该UIViewController的动画,当视图被加载并提出其发生之后进行。 所以,最好的地方是viewDidAppear。
写viewWillAppear
的instad viewDidAppear/viewDidLoad
。
由于viewWillAppear
的方法是调用在浏览时会出现( 过程 ),以获取更多信息有关viewWillAppear
阅读本正式文件。
- (void)viewWillAppear:(BOOL)animated
{
[self.searchBar becomeFirstResponder];
[super viewWillAppear:animated];
}
我知道这是一个有点老线,但我认为它可以帮助增加这个代码时所面临的一些问题,键盘的人。
请记住,文本字段委托设置在viewWillDisappear为零,否则键盘将不会再次,如果你弹出显示/关闭该视图控制器,无需关闭键盘。
文章来源: becomeFirstResponder works in viewDidAppear but doesn't work in viewDidLoad