UITableView / UISearchController的2个独立数据源

时间:2015-12-30 20:38:16

标签: ios objective-c uitableview

我在界面构建器中有一个带有4个预定义单元格的静态表视图。包含此静态tableview的tableviewcontroller的searchcontroller具有完全不同的数据源 - 也就是说,用户正在搜索的数据不在这4个静态单元格中。

之前,对于现已弃用的UISearchDisplayController,我可以这样做:

self.searchDisplayController.searchResultsDataSource = _searchResultsController;
self.searchDisplayController.searchResultsDelegate = _searchResultsController;

使用_searchResultsController实现tableview数据方法。我现在正在尝试向searchresultscontroller添加一个staticTableView属性,除非它没有通过,我不确定我应该怎么做。

OriginalTableViewController.m

- (void)viewDidLoad {
    _searchResultsController = [CustomSearchResultsController new];
    self.searchResultsController.originalTableViewController = self;
    self.searchResultsController.searchController = self.searchController;
    self.searchResultsController.staticTableView = self.tableView;
    self.tableView.dataSource = _searchResultsController;
    self.tableView.delegate = _searchResultsController;
    [self.tableView reloadData];
}

CustomSearchController.m

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    if (self.searchController.isActive) {
        return self.searchResults.count;
    } else {
        return [self.staticTableView numberOfRowsInSection:0];
    }
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (self.searchController.isActive) {
        // do some stuff with the separate data source
        return cell;
    } else {
        return [self.staticTableView cellForRowAtIndexPath:indexPath];
    }
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    if (self.searchController.isActive) {
        // do some stuff with the separate data srouce
    } else {
        [self.originalTableViewController tableView:tableView didSelectRowAtIndexPath:indexPath];
    }
}

当前在numberOfRowsInSection上崩溃,计数为0.即使我手动对return 4;进行硬编码,它仍会崩溃并说它无法从其数据源获取单元格。

我错过了什么吗?这是做这种事情的理想方式吗?任何见解都将不胜感激。

1 个答案:

答案 0 :(得分:1)

如果您使用UISearchController创建resultsController,请使用初始化:

searchController = UISearchController(searchResultsController: resultsController)

UISearchController将自动处理从静态表视图控制器到resultsController的切换 - 因此resultsController只需要处理显示搜索结果,而不是静态单元格。