如何用目标c实现UISearchController

我有一个现有的应用程序,写在Objective-C,与表视图。

我现在试图回到这个应用程序,并添加一个search栏到表。

问题是,现在有新的UISearchController协议,似乎有很less的信息在线如何在objective-c中实现这一点 – 所有的教程和例子,我可以find所有的斯威夫特。

我已经将代表添加到.h文件中:

 UISearchBarDelegate, UISearchResultsUpdating 

我在viewDidLoad有下面的代码,它工作并添加一个search栏:

 // Search controller searchController = [[UISearchController alloc] initWithSearchResultsController:nil]; searchController.searchResultsUpdater = self; searchController.dimsBackgroundDuringPresentation = NO; searchController.searchBar.delegate = self; // Add the search bar self.tableView.tableHeaderView = searchController.searchBar; self.definesPresentationContext = YES; [searchController.searchBar sizeToFit]; 

而且就我所知!

我将不胜感激任何指针,示例代码或教程如何在现有的Objective-C应用程序tableview中实现新的UISearchController。

初始化按照上述步骤执行以下操作。

1)在.h接口类中的 <UISearchBarDelegate, UISearchControllerDelegate, UISearchResultsUpdating>中的协议声明

2)声明以下属性

 //Fetch result controller @property (nonatomic, strong) UISearchController *searchController; //for the results to be shown with two table delegates @property (nonatomic, strong) CLCustomerResultrowsItemsCellController *searchResultsController; //this custom controller is only suppose to have number of rows and cell for row function of table datasource 

3)国家恢复

  @property BOOL searchControllerWasActive; @property BOOL searchControllerSearchFieldWasFirstResponder; 

4)在ViewDidload的这个步骤中初始化代码

 _searchResultsController = [[CLChatContactsSearchResultController alloc] init]; _searchController = [[UISearchController alloc] initWithSearchResultsController:_searchResultsController]; self.searchController.searchResultsUpdater = self; self.searchController.searchBar.placeholder = nil; [self.searchController.searchBar sizeToFit]; self.contactsTableView.tableHeaderView = self.searchController.searchBar; // we want to be the delegate for our filtered table so didSelectRowAtIndexPath is called for both tables self.searchResultsController.tableView.delegate = self; self.searchController.delegate = self; self.searchController.dimsBackgroundDuringPresentation = YES; // default is YES self.searchController.searchBar.delegate = self; // so we can monitor text changes + others // Search is now just presenting a view controller. As such, normal view controller // presentation semantics apply. Namely that presentation will walk up the view controller // hierarchy until it finds the root view controller or one that defines a presentation context. // self.definesPresentationContext = YES; // know where you want UISearchController to be displayed 

5)甚至使​​用button来启动控制器,如果有任何看到的评论,这些function将被用于将来的使用

 #pragma mark - UISearchBarDelegate - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { [searchBar resignFirstResponder]; } #pragma mark - UISearchControllerDelegate // Called after the search controller's search bar has agreed to begin editing or when // 'active' is set to YES. // If you choose not to present the controller yourself or do not implement this method, // a default presentation is performed on your behalf. // // Implement this method if the default presentation is not adequate for your purposes. // - (void)presentSearchController:(UISearchController *)searchController { } - (void)willPresentSearchController:(UISearchController *)searchController { // do something before the search controller is presented } - (void)didPresentSearchController:(UISearchController *)searchController { // do something after the search controller is presented } - (void)willDismissSearchController:(UISearchController *)searchController { // do something before the search controller is dismissed } - (void)didDismissSearchController:(UISearchController *)searchController { // do something after the search controller is dismissed } 

6)在文本search你得到这个callback

 #pragma mark - UISearchResultsUpdating - (void)updateSearchResultsForSearchController:(UISearchController *)searchController { // update the filtered array based on the search text NSString *searchText = searchController.searchBar.text; id <NSFetchedResultsSectionInfo> sectionInfo = [_fetchedResultsController.sections objectAtIndex:0]; if (searchText == nil) { // If empty the search results are the same as the original data self.searchResults = [sectionInfo.objects mutableCopy]; } else { NSMutableArray *searchResults = [[NSMutableArray alloc] init]; NSArray *allObjects = sectionInfo.objects; for (PhoneNumber *phoneMO in allObjects) { if ([phoneMO.number containsString:searchText] || [[phoneMO.closrr_id filteredId] containsString:searchText] || [[phoneMO.contact.fullname lowercaseString] containsString:[searchText lowercaseString]]) { [searchResults addObject:phoneMO]; } } self.searchResults = searchResults; } // hand over the filtered results to our search results table CLCustomerResultrowsItemsCellController *tableController = (CLCustomerResultrowsItemsCellController *)self.searchController.searchResultsController; tableController.filteredContacts = self.searchResults; [tableController.tableView reloadData]; } 

7)你必须在Custom类中声明filteredContacts属性来填充search到的项目。

8)多数民众赞成在select行比较表视图,如果其主控制器或自定义控制器类表视图,并为选定的项目进行操作。

希望这是有帮助的。