一般,我們用到UISearchDisplayController的時候,都是需要對一個數據源進行刷選,在UISearchDisplayController自帶的tableView中展示出來,然後點擊退出詳情.我最近在做大衆點評第三方的時候,遇到一個問題,我展示出了全部商店,想加搜索功能,但是不知道輸入的搜索關鍵字去跟什麼匹配,大衆點評也並沒有提供一個用來刷選的數據源接口,這樣,我只能自己輸入關鍵字,不用它數據源提供刷選補全內容,而直接點擊彈出鍵盤的搜索鍵,進行搜索.不過點擊搜索後,UISearchDisplayController的搜索狀態並不會取消,這並不是我想要了效果,調試了很久,最終還是解決了.
- #pragma mark - 點擊搜索,能夠取消搜索狀態
- #pragma mark UISearchDisplayDelegate
- - (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller
- {
- for (UIView *view in controller.searchBar.subviews)
- {
- NSLog(@"%d__|---%@",__LINE__,view);
- for (UIView *subView in view.subviews)
- {
- NSLog(@"%d__|!!!%@",__LINE__,subView);
- // 獲取"取消"按鈕
- if([subView isKindOfClass:[UIButton class]])
- {
- UIButton *cancelButton = (UIButton *)subView;
- // 獲取點擊"取消"按鈕的響應事件(actionsForTarget 這個方法返回的是一個數組)
- self.cancelSearchSELString = [[cancelButton actionsForTarget:controller.searchBar forControlEvent:UIControlEventTouchUpInside] objectAtIndex:0];
- // 響應通知,執行方法直接用上面獲得的響應事件方法,轉換一下(這是個知識點,可以擴展下)
- [[NSNotificationCenter defaultCenter] addObserver:controller.searchBar selector:NSSelectorFromString(self.cancelSearchSELString) name:@"cancelSearch" object:nil];
- }
- }
- }
- }
- #pragma mark UISearchBarDelegate------點擊搜索按鈕
- - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{
- // 獲取你想搜索的最終完整關鍵字(一般可以用來做搜索歷史展示)
- NSLog(@"%s__%d__|%@",__FUNCTION__,__LINE__,searchBar.text);
- // 點擊按鈕時,發佈取消搜索狀態通知
- [[NSNotificationCenter defaultCenter] postNotificationName:@"cancelSearch" object:nil];
- // 發佈---響應---取消通知
- [[NSNotificationCenter defaultCenter] removeObserver:searchBar name:@"cancelSearch" object:nil];
- }
@擴展一下知識點:
- 可以用actionsForTarget方法,來獲取針對某一特定事件目標的全部動作列表:
- [java] view plaincopyprint?
- NSArray* myActions = [ myControl actionForTarget:UIControlEventValueChanged ];
- // 一些特別的轉換
- @class NSString, Protocol;
- FOUNDATION_EXPORT NSString *NSStringFromSelector(SEL aSelector);
- FOUNDATION_EXPORT SEL NSSelectorFromString(NSString *aSelectorName);
- FOUNDATION_EXPORT NSString *NSStringFromClass(Class aClass);
- FOUNDATION_EXPORT Class NSClassFromString(NSString *aClassName);
- FOUNDATION_EXPORT NSString *NSStringFromProtocol(Protocol *proto) NS_AVAILABLE(10_5, 2_0);
- FOUNDATION_EXPORT Protocol *NSProtocolFromString(NSString *namestr) NS_AVAILABLE(10_5, 2_0);