[英]Perform action on UISearchBar when Keyboard is down and the x has been tapped
我有一個頂部帶有UISearchBar
的UITableView
,並且有一個不起作用的特定要求。
我的UISearchBar (showsCancelButton = NO)
上沒有取消按鈕UISearchBar (showsCancelButton = NO)
因此我完全依賴UISearchBar
內的x來取消現有搜索。 我依靠鍵盤的“搜索”按鈕關閉鍵盤(盡管在我的情況下稱為“完成”)。
當用戶在我的應用程序中搜索時,我將禁用navigation bar button
項,因為它給用戶帶來不好的體驗,並且只有在搜索取消后,用戶才能重新獲得導航欄按鈕項。 都可以了
我有一個特殊的場景,盡管我無法繞開。
1)點擊搜索欄以輸入文本
2)在鍵盤上單擊“完成”,鍵盤將消失
3)在鍵盤退回的情況下,x保留在UISearchBar
4)點擊UISearchBar
的x, SearchBar
的文本消失,視圖刷新
5)此時,應該再次啟用導航欄按鈕,但是沒有啟用。
碼:
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
self.timelineSearchBar.showsCancelButton = NO;
if ([searchText length] == 0)
{
[self.timelineSearchBar performSelector:@selector(resignFirstResponder)
withObject:nil
afterDelay:0];
}
我知道上面的代碼旨在在按下x時關閉鍵盤,這很好。
就我而言,鍵盤已經被辭職了,因此我希望點擊x即可重新啟用導航欄項。
self.addButton.enabled = YES;
因為上面的if語句根本不執行任何操作,並且導航欄項仍處於禁用狀態。
我什至嘗試了if語句:
[self.timelineSearchBar performSelector:@selector(enableAdd)
withObject:nil
afterDelay:0];
- (void)enableAdd
{
self.addButton.enabled = YES;
}
但這會崩潰,說明searchBar不響應該enableAdd選擇器。
我已經完成了一個斷點,並且看到當我點擊x時,上面的if語句的評估結果為true,它進入該語句,它“運行”代碼以啟用該按鈕,但從未發生。
我的最終編輯方法是:
- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar
{
[searchBar setShowsCancelButton:NO animated:YES];
self.addButton.enabled = YES;
}
更新:我已經嘗試過這里的鏈接http://engineeringtheworld.wordpress.com/2011/04/11/detecting-when-clear-is-clicked-in-uisearchbar-x-button/沒有成功-textField的shouldClear方法不會被調用。 我正在使用iOS 7,所以也許還有另一種方法可以將視圖嵌入到textFields中? 這很可能是正確的方法,但是它不適用於我的代碼,因為該示例中的for語句永遠不會被評估為true(我放入NSLog中)。
更新2:從上面的if語句中,我調用了searchBarCancelButton方法,並且導致了極端循環,因此,這當然不是正確的方法:
[self performSelector:@selector(searchBarCancelButtonClicked:) withObject:self.timelineSearchBar afterDelay: 0];
任何對此的指導將不勝感激。 我知道我錯過了關鍵一步,但我只是想不通。
問題是,輕敲X按鈕時, searchBar:textDidChange:
之前被稱為searchBarShouldBeginEditing:
即,這里是調用流程: searchBar:textDidChange:
-> searchBarShouldBeginEditing:
-> searchBarTextDidBeginEditing:
-> searchBarTextDidEndEditing:
textDidChange
的設置啟用為YES,但然后shouldBeginEditing
再次將其禁用。 這對我來說非常合適:
-(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar
{
self.addButton.enabled = NO;
}
-(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar
{
if(searchBar.text.length == 0){
self.addButton.enabled = YES;
}
}
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
if ([searchText length] == 0)
{
[searchBar performSelector:@selector(resignFirstResponder) withObject:nil afterDelay:0];
}
}
-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
self.addButton.enabled = [searchBar.text length] == 0;
[searchBar resignFirstResponder];
}
-(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
if([searchText length] == 0 && searchBar.text.length == 0)
{
self.addButton.enabled = YES;
[searchBar performSelector: @selector(resignFirstResponder)
withObject: nil
afterDelay: 0.1];
}
}
為了清楚起見,我在這里創建一個答案,但是盡管我的代碼可以正常工作,但是Michaels的答案在很大程度上為這提供了幫助,並且是這里公認的方法。
我對NSLogs
進行了很多研究,有趣的是,我發現shouldBeginEditing
出現在textDidChange
之前(按照textDidChange
的順序)。
但是,我還注意到,在原始問題的步驟中,關閉了鍵盤,並在UISearchBar中包含了文本,並且x可見,如果我輕按x,則不會出現鍵盤,但是它再次調用了shoudlBeginEditing
。
這是導致addButton繼續變灰的方法,因為該方法將該按鈕設置為禁用。
所以我調整了代碼:
- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)bar
{
NSLog(@"Should begin");
if ([self.timelineSearchBar.text length] > 0)
{
self.addButton.enabled = NO;
}
else
{
self.addButton.enabled = YES;
}
self.timelineSearchBar.showsCancelButton = NO;
BOOL boolToReturn = self.shouldBeginEditing;
self.shouldBeginEditing = YES;
return boolToReturn;
}
我將if條件放在其中,以便在用x取消后返回到searchBar時,代碼可以適當地做出反應。
這樣,添加按鈕不會在我單擊UISearchBar
(彈出鍵盤)后立即禁用。 但是,在textDidChange
(這是我看到的從鍵入的第一個字母開始調用的內容)中,我也設置了以下條件:
- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText
{
NSLog(@"Text did change");
self.timelineSearchBar.showsCancelButton = NO;
if ([self.timelineSearchBar.text length] > 0)
{
self.addButton.enabled = NO;
}
...
}
這樣, UISearchBar
僅在我開始輸入字母時才顯示添加按鈕。 這為我工作,因為如果用戶輕敲上UISearchBar
並沒有在任何類型,在prepareForSegue
那去認為,添加條目在呼喚,我檢查,如果搜索欄isFirstResponder
如果是這樣,我resignFirstResponder
。
考慮到這一點,我不確定這是否是Apple的處理方式,但這很干凈。 我會盡快知道我的應用是否因此而因此而被拒絕,但是非常感謝Michaels的幫助; 您確實為解決整個我整個下午問題的正確方向指明了方向!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.