1

Я пишу приложение для чата iOS, в котором мне нужно показать список пользователей с панелью поиска. Через каждые 2 минуты я получаю обновленный список пользователей с сервера.Обновление UITableView в то время как UISearchBar активен

Проблема, с которой я столкнулся это

Дело: 1 Если у меня есть панель поиска активной и зову перезагрузки таблицы, когда DataSource обновляется, теперь, если я отменить поиск, я не получу оригинал Таблица. Отображаются только отфильтрованные результаты.

Корпус: 2 Если у меня есть активная панель поиска, и я просто обновляю источник данных и не перезаряжаю таблицу, теперь, если я отменил поиск, он будет циклически перемещаться по cellforrowatindexpath столько раз, сколько есть элементов в новом datasource, но он не отображает обновленные элементы. Infact, он перемещает элементы, потому что рассматривает новые пути индекса, но использует старые данные.

По перемешалось я имею в виду,

  1. Скажем, если старый источник данных a1, a2, a3 и a4 с аватаров изображения a1, a2, a3, a4.

  2. Новый источник данных a5, a1, a2, a3, a4 с изображениями a5, a1, a2, a3, a4.

  3. Так перемешан вид, что я получаю a1 с a5 изображениями, a2 с a1 изображениями, а3 а4 изображений а4, без изображения.

4 клетки вместо 5.

Корпус: 3 (работает правильно) Если у меня есть панель поиска активной и я даже не обновлять источник данных, ничего не происходит, когда я отменить поиск (как и ожидалось). Мне нужно перезагрузить таблицу, чтобы получить обновленное представление.

Я хочу, чтобы он обновлял таблицу, даже если поиск активен, и когда я отменяю поиск, я должен получить обновленное представление таблицы. Я знаю, что это может быть достигнуто путем перезагрузки таблицы, когда нажата кнопка отмены, но я пытаюсь найти элегантное решение для этого.

Кроме того, пожалуйста, скажите мне концепцию (внутреннюю работу) за тем, почему это работает так.

Мой код:

- (void)refreshUserList 
{ 
    if(dtclass.updatedUserList && [resultsArray count] ==0) 
    { 
     userArray = dtclass.getUpdatedUserList; 
     [self.tableView reloadData]; 
     [dtclass setUpdatedUserList:NO]; 
    } 
    else if(dtclass.updatedUserList && [resultsArray count] !=0) 
    { 
     //Uncomment for Case:1 
     /*userArray = dtclass.getUpdatedUserList; 
     [dtclass setUpdatedUserList:NO]; 
     [self.tableView reloadData];*/ 

     //Uncomment for Case:2 
     /*userArray = dtclass.getUpdatedUserList; 
     [dtclass setUpdatedUserList:NO];*/ 

     //remove else if code for Case:3 
    } 
} 


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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection: (NSInteger)section 
{ 

    if (resultsArray.count != 0) 
    { 
     return [resultsArray count]; 
    } 

    return userArray.count; 
} 


-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    [tableView setSeparatorInset:UIEdgeInsetsMake(0, 70, 0, 0)]; 

    GlobalListTableViewCell *cell = (GlobalListTableViewCell *)[tableView dequeueReusableCellWithIdentifier:@"GlobalListCell"]; 

    if (cell == nil) 
    { 
     NSArray *nib = [[NSBundle mainBundle]  loadNibNamed:@"GlobalListTableViewCell" owner:self options:nil]; 
     cell = [nib objectAtIndex:0]; 
    } 
    //custome class User 
    User *currentUser; 

    if(resultsArray.count !=0) 
    { 
     currentUser = [resultsArray objectAtIndex:indexPath.row]; 
    } 
    else 
    { 
     currentUser = [userArray objectAtIndex:indexPath.row]; 
    } 

    cell.nameLabel.text = currentUser.getName; 
    cell.timeLabel.text = @"5 pm"; 

    dispatch_async(fetchImage, ^{ 

     if([[currentUser getAvatarUrl] length]!=0) 
     { 
      [self loadImagesWithURL:[NSString stringWithFormat:@"%@%@",@"http:",[currentUser getAvatarUrl]] IndexPath:indexPath]; 
     } 
    }); 


    cell.avatarImage.image = [UIImage imageNamed:@"defaultUser.png"]; 
    cell.messageLabel.text = @"No message"; 

    return cell; 
} 

-(void) loadImagesWithURL:(NSString *)imageURL IndexPath:(NSIndexPath *)indexPath 
{ 
    NSURL *url = [NSURL URLWithString:imageURL]; 
    NSData *data = [[NSData alloc ] initWithContentsOfURL:url]; 

    UIImage *img = [UIImage imageWithData:data]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 

     GlobalListTableViewCell *cell = (GlobalListTableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath]; 
     cell.avatarImage.image = img; 

    }); 
} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath: (NSIndexPath *)indexPath 
{ 
    return 60; 
} 


- (void)filterContentForSearchText:(NSString*)searchText scope: (NSString*)scope 
{ 
    resultsArray = [[NSArray alloc] init]; 
    NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF.getName contains[c] %@", searchText]; 

    resultsArray = [userArray filteredArrayUsingPredicate:resultPredicate]; 
} 

-(BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString 
{ 
    [self filterContentForSearchText:searchString 
          scope: [[self.searchDisplayController.searchBar scopeButtonTitles] 
            objectAtIndex: [self.searchDisplayController.searchBar 
               selectedScopeButtonIndex]]]; 


    return YES; 
} 

- (void)searchBarCancelButtonClicked:(UISearchBar *) aSearchBar { 
    aSearchBar.text = nil; 
} 
+0

для перемешались данных, вы должны перезагрузить клетку после того, как вид асинхронного изображения загружает изображение. –

+0

Также не учитывайте, что данные перезагрузки после изменения источника данных очень дорогостоящие ... Это не занимает много времени и производительности при условии, что вы используете надлежащий механизм dequeue –

ответ

1

Попробуйте этот код для поиска ..

- (void)filterContentForSearchText:(NSString*)searchText 
{ 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.getName contains[c] %@",searchText]; 
    _filteredGarages = [NSMutableArray arrayWithArray:[_allGarages filteredArrayUsingPredicate:predicate]]; 
} 

- (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { 
    [_filteredGarages removeAllObjects]; 
    if([searchText length] != 0) {   
     [self filterContentForSearchText:searchText]; 
    } 
    [self.tableView reloadData]; 
} 

- (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { 
    isSearching = NO; 
    [self.tableView reloadData]; 
} 

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { 
    if([searchBar.text isEqualToString:@""]) 
     isSearching = NO; 
    else isSearching = YES; 
    [self.tableView reloadData]; 
} 

-(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar 
{ 
    if([searchBar.text isEqualToString:@""]) 
     isSearching = NO; 
    else isSearching = YES; 
    [self.tableView reloadData]; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    resultsArray = [[NSMutableArray alloc] init]; 
    isSearching = NO; 
    userArray = [[NSMutableArray alloc] init]; 
    userArray = [//GetYourData//]; 
} 

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    if (tableView == self.searchDisplayController.searchResultsTableView) { 
     return [resultsArray count]; 
    } else { 
     return [userArray count]; 
    } 
} 

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // Do you table view cell job here ... 

    if (tableView == self.searchDisplayController.searchResultsTableView) { 
     isSearching = YES; 
     //fill the cell using resultsArray 
    } else { 
     //fill the cell using userArray 
    } 
} 
+0

. Ваше решение верное, как я уже упоминал в своем коде, что вызов перезагрузки tableview в строке поиска отменяет метод работает отлично. Я хочу лучшего решения, чем это, но если нет, то это мое последнее средство. –

+0

oh okey Я тебя понимаю, я думаю, это лучший .. – user3783005

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

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