使用UISearchController搜索TableView

时间:2015-06-05 03:00:38

标签: ios objective-c uitableview uisearchbar uisearchcontroller

我知道Apple弃用旧的搜索显示控制器。我有一个包含数据的表格,我只是创建一个搜索栏,允许用户使用搜索栏从表格视图中搜索数据(此数据仅包含字母名称)。我试图在一个点上使用以下代码来检测用户是否正在输入内容:

if(tableView == self.searchDisplayController.searchResultsTableView)

但我不能,因为苹果已经弃用旧的方式。我知道我现在必须使用UISearchController,我已经查看了Apple的文档和它们提供的示例代码,但我无法理解它。我到处寻找,但没有找到关于如何使用objective-c执行此操作的可靠示例/教程。任何人都可以解释我们如何将tableview与UISearchController结合使用以允许用户搜索数据?

1 个答案:

答案 0 :(得分:1)

我有一个简单的演示项目here

你需要一个TableviewController来显示数据,一个TableviewController来显示searchResult

例如,(链接中来自演示项目的代码)

声明SearchResultViewController

@interface SearchResultViewController : UITableViewController

然后在主表视图中

@interface SearchTableViewController()<UISearchBarDelegate,UISearchResultsUpdating>
@property (strong,nonatomic)NSMutableArray * dataArray;
@property (strong,nonatomic)UISearchController * searchcontroller;
@property (strong,nonatomic)SearchResultViewController * resultViewController;
@end

在viewDidLoad中,设置所有内容

self.resultViewController = [[SearchResultViewController alloc] init];
self.searchcontroller = [[UISearchController alloc] initWithSearchResultsController:self.resultViewController];
self.searchcontroller.searchBar.delegate = self;
self.resultViewController.tableView.delegate = self;
[self.searchcontroller.searchBar sizeToFit];
self.searchcontroller.searchResultsUpdater = self;
self.searchcontroller.dimsBackgroundDuringPresentation = NO;
self.definesPresentationContext = YES;
self.tableView.tableHeaderView = self.searchcontroller.searchBar;

然后在委托方法中,进行实际搜索并更新searchResultViewController

#pragma mark - search bar delegate
-(void)searchBarCancelButtonClicked:(UISearchBar *)searchBar{
    [searchBar resignFirstResponder];
}
#pragma mark - UISearchResultUpdating
//Do real search,this is up to you
-(void)updateSearchResultsForSearchController:(UISearchController *)searchController{
    NSString * searchtext = searchController.searchBar.text;
    NSArray * searchResults = [self.dataArray filteredArrayUsingPredicate:[NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
        BOOL result = NO;
        if ([(NSString *)evaluatedObject hasPrefix:searchtext]) {
            result = YES;
        }
        return result;
    }]];
    SearchResultViewController *tableController = (SearchResultViewController *)self.searchcontroller.searchResultsController;
    tableController.dataArray = searchResults;
    [tableController.tableView reloadData];

}