2014-10-02 14 views
3

我正在篩選剛剛開始的新工作中的預先存在的代碼,並且我遇到的第一個錯誤之一是連接到UITableView子類的搜索欄,該子類在每次擊鍵之後都會關閉鍵盤。經過一番搜索,我發現this SO question,似乎我找到了我的答案:應用程序正在使用reloadData刷新每次擊鍵後的結果,並且重新載入時調用了resignFirstResponder並關閉了鍵盤。令人沮喪,但解釋和理解。UITableView在一個地方解除了reloadData上的鍵盤,但在另一個地方沒有?

但後來我的老闆指出我們在應用程序的其他地方使用幾乎完全相同的代碼,並且它完美地工作。那怎麼可能?我發現自己處於不尋常的位置,需要解釋爲什麼某些東西可以工作,因爲上面的鏈接表明在reloadData期間解除鍵盤是「正常」行爲。

下面是兩個ViewController的相關方法,每個ViewController都是從相同的自定義UITableView進行分類的。 (這些方法已經簡化了,但不同的行爲依然存在。)我認爲它的一部分必須是埋在兩個亞類之間的差異,但如果問題存在,並且它不會在任何地方被覆蓋,那意味着子類是不相關的?

查找視圖:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ 
    [self.tableView reloadData]; 
    NSLog(@"Lookup Reloaded"); 
} 

搜索查看:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{ 
    [self.tableView reloadData]; 
    NSLog(@"Search Reloaded"); 
} 

正如你所看到的,它們是相同的。在每次按鍵之後,兩者都被成功地調用,然而前者解除鍵盤而後者不解除鍵盤。

這些視圖控制器中的每一個都超過一千行,所以我很難縮小可能導致不同行爲的因素。能理解FirstResponders和TableView重載的人能幫我提供一些關於看哪裏的線索嗎?這似乎是一個相當簡單的過程(按鍵>該方法被稱爲>重新加載表>鍵盤在過程中被解散)沒有太多空間來改變該行爲,但顯然有一種方法來阻止最後一步,因爲搜索視圖已經在做它。

任何想法,我應該集中我的搜索找出原因?

+0

您的表是否在其他情況下重新加載鍵盤沒有解僱? – nikhil84 2014-10-10 06:14:21

回答

1

所以,答案結果太過複雜,應用程序特定值得詳細介紹,但基本上是由於一種奇怪的黑客方法實現,有幾個自定義對象與位於UITableView的第一行(部分0,行0)的單元內的UISearchBar

UITableView重新加載時,第一行被重新制作,這意味着這些對象被重新制作,這就排除了鍵盤。當我問我的新老闆爲什麼他們這樣做時,他不記得了。

OOF。

1

也許嘗試繼承UISearchBar並重寫- (BOOL)resignFirstResponder。使用你的子類,而不是UISearchBar,並在該方法中放置一個斷點,你可以看到它從哪裏被調用?

+0

我會試一試,但這會解釋爲什麼它在一個地方而不是另一個地方工作?我不能動搖那種答案在我面前的感覺,我不能把它放在手指上。 – Nerrolken 2014-10-07 17:12:15

+0

如果你在兩個地方使用子類,然後比較堆棧跟蹤,它將有希望變得明顯 - 我沒有看到這發生自己不幸的 – davbryn 2014-10-07 17:32:52

+0

這不是答案,但我最終在調查這一個時找到答案。所以在這裏,有一個賞金! :D我已經把最後的原因添加爲我自己的答案,以防其他人遇到這種奇怪的情況。 – Nerrolken 2014-10-13 16:20:04

2

檢查此方法是否已在此UISearchBar的任一代表上實現。

- (BOOL)searchBarShouldEndEditing:(UISearchBar *)searchBar; 

如果此方法返回NO,它將阻止搜索欄退出第一個響應者。

相關問題