使用UISearchController但没有重载tableView

时间:2016-02-14 09:21:24

标签: objective-c ios9 reloaddata uisearchcontroller

我正在尝试添加搜索栏来搜索我的tableView。只有一个TableViewController添加了searchBar。我检查了所有现有的指南和苹果示例代码,并按照说明进行操作,但在输入搜索字符串后,我的tableView不会重新加载。我使用NSLog检查了我的代码,并且我确定搜索文本已正确上传,并且使用NSPredicate过滤了新数组。我已经在" updateSearchResultsForSearchController的末尾添加了[self.tableView reloadData]: "方法,但我的tableViewController仍未更新。我是iOS编程的新手,不知道我做错了什么。感谢您能快速浏览我的代码并向我反馈。以下是摘要:

@property (nonatomic,strong) UISearchController *searchController;
@property (nonatomic,strong) NSArray *myList;   //original data list
@property (nonatomic,strong) NSArray *mysearchResult;   //filtered list



  - (void)viewDidLoad {
        [super viewDidLoad];
        self.searchController=[[UISearchController alloc]initWithSearchResultsController:nil];
        self.searchController.searchResultsUpdater=self;
        self.searchController.dimsBackgroundDuringPresentation=NO;
        self.searchController.searchBar.delegate=self;
        self.tableView.tableHeaderView=self.searchController.searchBar;
        self.definesPresentationContext=YES;
        [self.searchController.searchBar sizeToFit];
    }
    -(void)updateSearchResultsForSearchController:(UISearchController *)searchController {
    NSString *searchString=self.searchController.searchBar.text;
    NSPredicate *mypredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@", searchString];
    self.mysearchResult=[self.myList filteredArrayUsingPredicate:mypredicate];
    [self.tableView reloadData];
}

"的cellForRowAtIndexPath" tableView代码的方法:(类似地" numberOfRowsInSection"更新)

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
MyCustomCell codes..... 
if (tableView==self.tableView) {
        cell.cellLabel.text=[self.myList objectAtIndex:indexPath.row];
    } else 
        cell.cellLabel.text=[self.mysearchResult objectAtIndex:indexPath.row];

    return cell;
}

2 个答案:

答案 0 :(得分:0)

在填充tableView之前,首次使用mysearchResult而不是myList。此时,两个阵列中的数据应该相同。

self.mysearchResult = [[NSArray alloc] initWithArray:myList];

现在使用谓词后,您正在更新mysearchResult,这很好。当您再次取消搜索时,会从mysearchResult填充实际包含所有原始数据的myList

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    [self.mysearchResult count];
}
 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
MyCustomCell codes..... 

//Remove your If condition from here
        cell.cellLabel.text=[self.mysearchResult objectAtIndex:indexPath.row];
    return cell;
}

答案 1 :(得分:-2)

试试这个,可能有用:

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText{
    NSString *searchString=self.searchController.searchBar.text;
    NSPredicate *mypredicate = [NSPredicate predicateWithFormat:@"SELF contains[c] %@", searchString];
    self.mysearchResult=[self.myList filteredArrayUsingPredicate:mypredicate];
    self.searchBar.scopeButtonTitles = self.mysearchResult;  
}