2013-03-18 75 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,否則如果在不關閉鍵盤的情況下彈出/關閉視圖控制器,鍵盤將不會再顯示。

相關問題