2013-03-18 122 views
10

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

我可以确保已调用viewDidAppearviewDidLoad

如果我希望搜索栏能够立即关注视图,我应该怎么做?

(我用故事板)

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

+0

你在哪里启动你的搜索栏? – 2013-03-18 08:57:45

+0

您是否尝试将[self.searchBar becomeFirstResponder]放入viewWillAppear?它在viewDidLoad之后调用,但viewController不可见 – Mikhail 2013-03-18 08:58:04

+0

@roronoazorro:我正在使用StoryBoard。 – 2013-03-18 10:20:47

回答

1

viewWillAppear instash的viewDidAppear/viewDidLoad

因为viewWillAppear方法是调用在浏览时会出现(过程),对所有IBOutlet中对象被加载在viewDidLoad中,如果要调用的方法的详细信息about viewWillAppear read this official Document.

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

不幸的是它不起作用。 – 2013-03-18 10:24:56

+0

@ XhackerLiu-我尝试在我的应用程序后放置代码..有工作正常:) – iPatel 2013-03-18 10:25:53

+0

谢谢。在我的情况下,在viewWillAppear中,'self.searchBar.window'仍然是零。你知道这件事吗? – 2013-03-18 10:32:25

4

viewDidLoad中那么该动作没有执行加载的对象,因为之前我们不能做任何事情,是whybetter编写代码

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

那么它的工作原理罚款。

+0

不幸的是,它不起作用。 – 2013-03-18 10:19:53

5

可能它在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 
    }); 
} 

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

+0

我只是尝试viewWillAppear,但仍然没有工作。 – 2013-03-18 10:26:22

+1

也许子视图并重写'didMoveToWindow'? – Taum 2014-02-26 15:30:33

2

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

+0

“注意:确保您的应用程序在分配一个对象成为第一响应者之前已经建立了它的对象图,例如,您通常在overrideover viewDidAppear:方法中调用becomeFirstResponder方法如果尝试将第一响应者在viewWillAppear:中,您的对象图尚未建立,因此becomeFirstResponder方法返回“否” “ - https://developer.apple.com/library/ios/documentation/EventHandling/Conceptual/EventHandlingiPhoneOS/event_delivery_responder_chain/event_delivery_responder_chain.html – mkirk 2016-05-16 02:11:39

2

这将帮助:

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

一般而言,幻数和延迟只是一个糟糕的主意。 – 2014-09-18 16:12:51

+3

'dispatch_get_main_queue(),^ {[self.quantifyTextField becomeFirstResponder];});' – 2015-11-17 13:53:28

+0

另一种选择:'textField.becomeFirstResponder()中的NSOperationQueue.mainQueue()。addOperationWithBlock {[textField]}' – 2016-03-22 13:56:13

1

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

请记住在viewWillDisappear中将textfield委托设置为nil,否则如果在不关闭键盘的情况下弹出/关闭视图控制器,键盘将不会再显示。

相关问题