2011-05-09 84 views
6

我的應用程序有一個搜索欄,用於從sqlite數據庫填充的表視圖中搜索記錄。 我的問題是,當視圖打開時,「取消」按鈕沒有啓用,我也無法觸及它,就像只有一個圖像。它在那裏,但沒有采取任何行動。 當我們點擊那個搜索欄文本時,取消按鈕將被改爲「完成」,啓用它。 所以這裏是我的代碼搜索欄取消按鈕不起作用

這是我的搜索欄視圖,請參閱取消button.It未啓用

this is my search bar view.see that cancel button.It is not enabled

- (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar 
{ 
    //[newSearchBar setShowsCancelButton:YES animated:YES]; 


    newSearchBar.autocapitalizationType = UITextAutocapitalizationTypeAllCharacters; 

    NSLog(@"search begin edit") ; 

    //searchString = searchBar.text; 

    //NSLog(@"print did edit searchstring : %@", searchString) ; 

    for(UIView *view in [searchBar subviews])  
    { 

     //shareItemId =newSearchBar.text; 

     if([view isKindOfClass:[NSClassFromString(@"UINavigationButton") class]]) { 
      [(UIBarItem *)view setTitle:@"Done"]; 

     } 
     } 

- (void)searchBarTextDidEndEditing:(UISearchBar *)searchBar 
{ 
    NSLog(@"searchBarTextDidEndEditing:"); 


    [searchBar resignFirstResponder]; 
    //[self dismissModalViewControllerAnimated:YES]; 
} 

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar 
{ 
    NSLog(@"searchBarSearchButtonClicked"); 


    searchString = searchBar.text; 
    NSLog(@"search %@", searchBar.text); 
    [newSearchBar setShowsCancelButton:NO animated:YES]; 

    [searchBar resignFirstResponder]; 
    //[self dismissModalViewControllerAnimated:YES]; 
} 

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar 

{ 
    NSLog(@" searchBarCancelButtonClicked"); 


    [searchBar resignFirstResponder]; 

    shareItemName =newSearchBar.text; 

    [self dismissModalViewControllerAnimated:YES]; 

} 

- (BOOL)searchBarShouldBeginEditing:(UISearchBar *)searchBar { 

    NSLog(@"searchBarShouldBeginEditing"); 


    [newSearchBar setShowsCancelButton:YES animated:YES]; 
    return YES; 
} 

這些都是我爲

代表請檢查我的代碼,並給我答案。我需要啓用「取消」按鈕,當視圖被加載,它的行動將回到以前的觀點

我需要這樣的

enter image description here

要不我怎麼能添加另一個取消按鈕激活取消button.so,我可以啓用that.please給我所有的細節

+0

是方法'searchBarCancelButtonClicked'叫什麼名字? – visakh7 2011-05-09 07:41:05

+1

@ 7KV7 - 如果按鈕被禁用,它甚至會被調用嗎?我的猜測是,當搜索文本字段不是第一響應者時,UISearchBar的行爲是禁用取消按鈕。 – 2011-05-09 08:27:02

+0

您可以手動強制啓用它,如http://stackoverflow.com/questions/4348351/uisearchbar-disable-auto-disable-of-cancel-button/4349003#4349003中所述。 – Palimondo 2011-10-20 13:24:16

回答

4

我的猜測是,蘋果的UISearchBar的方式,取消按鈕被禁用,如果搜索文本字段爲空或不先響應者。

這是有道理的,因爲您不應該使用「取消」按鈕來達到除實際取消搜索之外的其他目的。並且由於沒有要取消的搜索 - 該按鈕被禁用。

如果您仍然希望該按鈕將立即生效,提出的觀點時,你可以在viewWillAppear:打電話[mySearchBar becomeFirstResponder];

這將導致鍵盤出現,該按鈕將被啓用。 然後如果用戶點擊取消,您可以攔截它返回到上一個視圖。 (我不確定蘋果是否會喜歡這種行爲)。

示例代碼:

-(void) viewWillAppear : (BOOL) animated 
{ 
    [super viewWillAppear:animated]; 
    // Make keyboard pop and enable the "Cancel" button. 
    [self.mySearchBar becomeFirstResponder]; 
} 
+0

它不工作...不知道爲什麼。我認爲這是不可能的,我不想在點擊搜索欄標籤文本之前先拔起鍵盤。因爲在點擊搜索欄時在表中啓用了預測搜索標籤文本只有我需要鍵盤拉起 – Ramz 2011-05-09 09:49:06

+0

這絕對是可能的,因爲我試了一下,它的工作。但是,如果你不想讓鍵盤出現,我沒有看到其他選項,而不是製作自己的「SearchBar」。只是一個附近有按鈕的文本框,你已經設置好了。 – 2011-05-09 09:58:58

6

您需要設置UISearchDisplayController活躍,像這樣:

[mySearchDisplayController setActive:YES animated:YES]; 

或者更簡單地說:

mySearchDisplayController.active = YES; 
+0

它會引起成爲第一響應者的相同效果嗎?意味着,鍵盤會彈出? – 2011-05-10 13:12:34

+0

不,我不這麼認爲 - 成爲第一響應者是控制鍵盤的東西。 – Rayfleck 2011-05-10 13:20:40

3

這裏就是我所做的,以始終啓用取消按鈕,即使搜索字段不是第一響應者。

我調用此方法,每當我打電話resignFirstResponder在搜索領域

- (void)enableCancelButton { 
    for (UIView *view in self.searchBar.subviews) { 
     if ([view isKindOfClass:[UIButton class]]) { 
      [(UIButton *)view setEnabled:YES]; 
     } 
    } 
} 

這工作,但我不知道它是否會通過App Store的驗證還,所以需要您自擔風險使用它。此外,這可能只適用於取消按鈕是您使用搜索字段的唯一按鈕。

+3

爲什麼不通過App Store驗證,您使用的是所有公共API。 – fatih 2012-08-13 20:34:36

+0

此技術似乎不再有效,因爲self.searchBar.subviews沒有任何UIButton。我只是在iOS 8.x上試過/測試過它。 – Mustafa 2014-12-11 11:45:55

0

本工程以重新啓用取消按鈕的iOS 8:

private func enableButtonsInSubviews(view: UIView) { 
    if let view = view as? UIButton { 
     view.enabled = true 
    } 

    for subview in view.subviews { 
     enableButtonsInSubviews(subview) 
    } 
}