2016-02-14 5 views
0

Я пытаюсь добавить строку поиска для поиска через мой tableView. Существует только один TableViewController, в который добавлен searchBar. Я проверил все существующие руководства и примеры кода Apple и выполнил инструкции, но почему-то мой tableView не перезагружается после ввода строки поиска. Я проверил свои коды с NSLog, и я уверен, что текст поиска правильно загружен, и новый массив фильтруется с помощью NSPredicate. Я добавил [self.tableView reloadData] в конце метода updateSearchResultsForSearchController :, но все же мой tableViewController не обновляется. Я новичок в программировании на iOS и не уверен, что я делаю неправильно. Оцените, можете ли вы быстро взглянуть на мои коды и обратную связь ко мне. Вот резюме:использование UISearchController, но tableView не перезагружается

@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; 
} 
+0

ли вы назначить DataSource tabeView и делегировать? – curious

+0

У вас есть только один TableView? Если так, ваше условие if всегда будет истинным. и ваши данные всегда загружаются из self.myList. Решение представлено ниже. –

ответ

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; 
} 
+0

Спасибо, сейчас он показывает результат поиска. В настоящее время, когда я нажимаю на панель поиска, она скрывает данные перед заполнением таблицы результатом поиска, который я попытаюсь исправить в ближайшие дни. есть идеи? – Mariam

+0

уточните в методах делегатов панели поиска. Может быть, ваш массив становится пустым в этом методе, и вы перезагружаете данные в это время. Во-вторых, отметьте мой ответ как принятый;) Я решил вашу проблему :) –

+0

даже после того, как поиск отменен, таблица не перезагружена обратно, я думаю, что создам другой tableViewcontroller, подобный образцу кода Apple. Я хотел проголосовать, но, поскольку я новичок, он говорит, что мне нужно сначала заработать репутацию. Верный? – Mariam

-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; 
} 
+0

Я попробовал решение Shehzad Ali ниже, и это сработало, но спасибо за ваше время. – Mariam

 Смежные вопросы

  • Нет связанных вопросов^_^