5

我在InterfaceBuilder的UITableViewController中添加了一個UISearchDisplayController。通過添加一個searchBar: searchBar textDidChange: searchText方法來重新生成表格的數據數組,並調用reloadData,這很容易實現。如何使用UISearchDisplayController預加載或初始化搜索?

但是我希望在用戶下一次觸摸搜索欄時顯示上一個搜索結果,因爲觸摸(X)並清除它比再次輸入它更容易。但我無法做到這一點。下面是我試過的代碼:

- (void) searchBar: (UISearchBar *) searchBar textDidChange: (NSString *) searchText { 
    if(searchText && [searchText length] > 0) { 
     self.displayedRows = [[NSMutableArray initWithCapacity: 1]; 
     for(NSString *l in self.allRows) { 
      NSRange r = [l rangeOfString: searchText]; 
      if(r.location != NSNotFound) 
       [self.displayedRows addObject: l]; 
     } 
     [self.searchDisplayController.searchResultsTableView reloadData]; 
    } 
} 

- (void) searchDisplayControllerWillBeginSearch: (UISearchDisplayController *) controller { 
    if(self.lastSearch && [self.lastSearch length] > 0) { 
     controller.searchBar.text = self.lastSearch; 
     [controller.searchResultsTableView reloadData]; 
    } 
} 

- (void) searchDisplayControllerWillEndSearch: (UISearchDisplayController *) controller { 
    self.lastSearch = controller.searchBar.text; 
    self.displayedRows = self.allRows; 
    [self.tableView reloadData]; 
} 

最後搜索文本是適當的搜索欄下一次我接觸到的搜索,我很驚訝的是,「光標」甚至在位於端部,但搜索結果不會顯示,只是原始內容的黑暗視圖(例如搜索字段爲空)。只要我輸入一個字符,搜索結果就會被更新。

我試圖把的[self.searchDisplayController.searchResultsTableView reloadData]等效到每個:

searchDisplayControllerDidBeginSearch: (UISearchDisplayController *) controller 
searchDisplayController: (UISearchDisplayController *) controller didLoadSearchResultsTableView: (UITableView *) tableView 
searchDisplayController: (UISearchDisplayController *) controller willShowSearchResultsTableView: (UITableView *) tableView 
searchDisplayController: (UISearchDisplayController *) controller didShowSearchResultsTableView: (UITableView *) tableView 

但它並沒有區別......只是空白,直到我輸入一些東西。

有沒有人有任何想法如何獲得預加載的搜索結果?

回答

7

你需要的東西是這樣的:

- (void) searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller { 
    if(lastSearch.length > 0) { 
     NSLog(@"In searchDisplayControllerDidBeginSearch"); 
     [self.searchDisplayController.searchBar setText:lastSearch]; 
    } 
} 

如果需要作進一步的修改,我建議開放UIKitUISearchBar.hUISearchDisplayController.h,看着你可以重載和位置。此外,NSLog是你的朋友=)

只是爲了解釋什麼是怎麼回事,這是怎麼從...searchBar.text = lastSearch不同,setText力量textDidChange註冊,這反過來又重新進行搜索,隨後有致電shouldReloadTableForSearchString。只改變文字而不使用setText(出於某種原因)不會觸發textDidChange

+0

令人驚訝的是,我以爲我試過了所有不同的willBegins和didBegins的所有可能的組合,但我只是移動`reloadData`部分,因爲之前的搜索測試總是在搜索字段中。 – LavaSlider 2011-02-03 02:13:08