2016-03-31 9 views
0

検索とフィルタリング後にUITableViewCellsを設定するという単純な問題に取り組んでいます。ここでフィルタリング後にuitableviewcellにデータを挿入すると、セルの内容は常に同じになります

は、細胞を移入するためのいくつかのコードです:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell; 
    .... etc 
     if ([self.searchController isActive] && (![self.searchController.searchBar.text isEqualToString:@""])) { 
      NSArray *results = [self.searchResults mutableCopy]; 
      if (results.count == 0) { 
       // do nothing 
      } else { 
       for (NSInteger i = 0; i < results.count; i ++) { 
        NSString *fullName = [results objectAtIndex:i]; 
        ((SSContactTableViewCell *)cell).fullNameLabel.text = fullName; 
       } 
      } 
     } else { .. etc 

私はので、私はそれをデバッグすることができ、私のコードの多くを分離し、ここで私は、文字「T」を検索したときの私の結果は次のとおりです。

結果配列に6つの項目があり、すべてに文字 't'が含まれていることがわかります。 enter image description here

残りは同様によさそうだ、firstNameのは「クレイトンファー」で、セルの内容は、「クレイトンファー」 enter image description here enter image description here

あるしかし、私のアプリで、名前だけ「Hally Wernstormは、」塗りつぶし。 enter image description here

私はこれがもちろん起こりたくないので、コードのどこに「ハリーウェーンストーム」が戻ってくるのだろうと思いましたか?

私が書いてきたいくつかのコード:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell; 
    if (self.contactsButton.selected) { 
     cell = [tableView dequeueReusableCellWithIdentifier:@"ContactCell" forIndexPath:indexPath]; 
     if ([self.searchController isActive] && (![self.searchController.searchBar.text isEqualToString:@""])) { 
      NSArray *results = [self.searchResults mutableCopy]; 
      if (results.count == 0) { 
       // do nothing 
      } else { 
       for (NSInteger i = 0; i < results.count; i ++) { 
        NSString *fullName = [results objectAtIndex:i]; 
        ((SSContactTableViewCell *)cell).fullNameLabel.text = fullName; 
       } 
      } 
     } else { 
      NSArray *sectionArray = [self.contacts filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF beginswith[c] %@", [self.indexTitles objectAtIndex:indexPath.section]]]; 
      NSString *fullName = [sectionArray objectAtIndex:indexPath.row]; 
      ((SSContactTableViewCell *)cell).fullNameLabel.text = fullName; 
      ((SSContactTableViewCell *)cell).specialtyLabel.text = [self.specialities objectAtIndex:indexPath.row]; 
      [((SSContactTableViewCell *)cell).avatarButton setTitle:[NSString initialsOfStrings:[fullName componentsSeparatedByString:@" "]]]; 
     } 
    } 
    else if (self.patientsButton.selected) { 
     cell = [tableView dequeueReusableCellWithIdentifier:@"PatientCell" forIndexPath:indexPath]; 
     NSArray *sectionArray = [self.patients filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF beginswith[c] %@", [self.indexTitles objectAtIndex:indexPath.section]]]; 
     ((SSPatientTableViewCell *)cell).fullNameLabel.text = [sectionArray objectAtIndex:indexPath.row]; 
    } 
    else if (self.favouritesButton.selected) { 
//  cell = [tableView dequeueReusableCellWithIdentifier:@"ContactCell" forIndexPath:indexPath]; 
    } 
    return cell; 
} 

#pragma mark - UISearchControllerDelegate 

- (void)updateSearchResultsForSearchController:(UISearchController *)searchController { 
    NSString *searchString = searchController.searchBar.text; 
    if (searchString == nil) { 
     self.searchResults = [self.contacts mutableCopy]; 
    } else { 
     self.searchResults = [[NSMutableArray alloc] init]; 

     for (NSString *name in self.contacts) { 
      if ([name.lowercaseString containsString:searchString.lowercaseString]) { 
       [self.searchResults addObject:name]; 
      } 
     } 
    } 
    [self.tableView reloadData]; 
} 
- (void)searchBar:(UISearchBar *)searchBar selectedScopeButtonIndexDidChange:(NSInteger)selectedScope { 
    [self updateSearchResultsForSearchController:self.searchController]; 
} 

#pragma mark - UITableViewDataSource 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    if (self.searchController.active) { 
     if (self.searchResults.count == 0 && (![self.searchController.searchBar.text isEqualToString:@""])) { 
      return 0; 
     } 
    } 
    return 26; 
} 


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    if (self.contactsButton.selected) { 
     NSArray *sectionArray = [self.contacts filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF beginswith[c] %@", [self.indexTitles objectAtIndex:section]]]; 
     return [sectionArray count]; 
    } else if (self.patientsButton.selected) { 
     NSArray *sectionArray = [self.patients filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF beginswith[c] %@", [self.indexTitles objectAtIndex:section]]]; 
     return [sectionArray count]; 
    } else if ([self.searchController isActive] && (![self.searchController.searchBar.text isEqualToString:@""])) { 
     return [self.searchResults count]; 
    } 
    return 6; 
} 

感謝を助けることができる誰にも。

+0

にあなたが作成しているセルどんなにを使用し、あなたは結果に、最終的なものにのfullNameを設定します。 (実際には、すべての名前に順番にそれを設定しますが、最後のものでループを終了します) –

+0

ああ、ありがとうございます!私はこの前に間違いを犯しましたが、私はずっと忘れています。 – sallyp

答えて

3

これは、tableView検索を管理する適切な方法ではありません。

フィルタを適用した配列を作成し、それが変更されるたびにテーブルベースをリロードする必要があります。

+0

私は通常forループを使っていません。これは前に行ったことです: ((SSContactTableViewCell *)cell).fullNameLabel.text = [self.searchResults objectAtIndex:indexPath.row];私は解決しなければならないセクションに問題があります。コメントありがとうございます! – sallyp

1

forループの使用は正しい方法ではありません。

forループを使用しているので、常に同じ名前になります。

は親切に、この通過し、このsearch bar in objective-c demo

+0

ありがとうございます。私は通常、別の方法でこれを行います。\t ((SSContactTableViewCell *)cell).fullNameLabel.text = [self.searchResults objectAtIndex:indexPath.row];しかし、私は解決しなければならないセクションに問題があります。それがforループを試した理由です。 – sallyp

関連する問題