[iOS] UISearchDisplayDelegate和UISearchBarDelegate的差異

先來看看文件解釋:

UISearchBarDelegate:定義一些可供選擇的方法讓你實作的UISearchBar控制器使用。UISearchBar物件提供使用者介面在Bar上的搜尋field。但是按鈕是由app負責去實作動作。最低限度是這個委任需要在text輸入到text field時去執行搜尋。

UISearchDisplayDelegate:定義了UISearchDisplayController的物件的委任方法。

其實這兩個差很多,前者主要是幫搜尋列實作它的功能,後者有管理到他所搜尋的table。

如何使用UISearchBarDelegate

一般說來,你要在nib裡面拉一個Search Bar,然後由file's owner來接受委任。然後在View Controller實作裡面處理搜尋:

  1. -(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar;
    處理Search鍵被按下時要做的事情
  2. -(void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText;
    處理當Search字串改變時要做的事
  3. -(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar;
    處理Cancel按鈕按下後要做的事情
當然不止這些,但是這些算是最基本要實作的方法。

如何使用UISearchDisplayDelegate

這個做法比較不一樣,你不需要在nib裡面拉什麼元件,只需要有拉出Table View就好了。然後實作一些委任方法:
  1. - (void)searchDisplayController:(UISearchDisplayController *)controller
      didLoadSearchResultsTableView:(UITableView *)tableView;
    這是告訴委任,controller已經載入了它的Table View
  2. - (BOOL)searchDisplayController:(UISearchDisplayController *)controller
    shouldReloadTableForSearchString:(NSString *)searchString;
    這是說,如果Table View應該為了給定的搜尋字串而重新載入,那就要求委任這樣做。如果沒有時作這個方法,那一旦搜尋字串改變,result table就會重新載入。
而你要在viewDidLoad裡面初始化UISearchDisplayController物件:

  1. 首先製作一個UISearchBar。
  2. 將這UISearchBar放在table view的tableHeaderView裡面:
    EX: tableView.tableHeaderView = searchBar;
  3. 用這UISearchBar去初始化UISearchDisplayController:
    EX: searchController = [[UISearchDisplayController alloc]
                            initWithSearchBar:searchBar
                            contentsController:self];
    contentsController是指出用來管理會被搜尋的內容的控制器為何。









留言