【问题标题】:Using UISearchController to search TableView使用 UISearchController 搜索 TableView
【发布时间】:2015-06-05 11:31:49
【问题描述】:

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

if(tableView == self.searchDisplayController.searchResultsTableView)

但我不能,因为 Apple 已经弃用了旧方法。我知道我现在必须使用 UISearchController,并且我查看了 Apple 的文档和他们提供的示例代码,但我无法理解它。我到处寻找,但没有找到关于如何使用objective-c做到这一点的可靠示例/教程。谁能解释一下我们如何将 tableview 与 UISearchController 结合使用以允许用户搜索数据?

【问题讨论】:

  • UICatalog 有很多例子可以使用 Obj-C 和 Swift 实现 UISearchController

标签: ios objective-c uitableview uisearchbar uisearchcontroller


【解决方案1】:

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

你需要一个 TableviewController 来显示数据,一个 TableviewController 来显示搜索结果

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

声明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];

}

【讨论】:

  • 我什么时候调用这个类?我的表格视图在我的 ViewController.m
  • 你只需要使用searchController提供的searchBar,就可以在delegate方法中获取action。然后改变searchResultController。就是这个逻辑
猜你喜欢
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多