如何在UITableView中修复重复搜索结果

时间:2018-01-03 05:14:30

标签: ios objective-c iphone uitableview

我有一个带搜索栏功能的UITableView。但是,当我搜索任何关键字时(请参阅附件中的截图),搜索结果将重复并返回超过1个结果。

我的预期结果应该是搜索结果会根据输入的关键字反映出来。

非常感谢您的帮助。请帮忙,谢谢。 enter image description here enter image description here     

 @interface Friend_ViewController () 

@end @implementation Friend_ViewController{ NSMutableArray *tableData; UITableView *tableView; BOOL isFiltered; NSMutableArray *stateNamesArray; NSArray *searchResult; } - (void)viewDidLoad { [super viewDidLoad]; isFiltered =false; UIImage* image3 = [UIImage imageNamed:@"Add_Friend"]; CGRect frameimg = CGRectMake(0,0, image3.size.width -10, image3.size.height); UIButton *btn_add_friends = [[UIButton alloc] initWithFrame:frameimg]; [btn_add_friends setBackgroundImage:image3 forState:UIControlStateNormal]; [btn_add_friends addTarget:self action:@selector(addFriendButtonDidPressed:) forControlEvents:UIControlEventTouchUpInside]; [btn_add_friends setShowsTouchWhenHighlighted:YES]; UIBarButtonItem *btn_add_friends_item =[[UIBarButtonItem alloc] initWithCustomView:btn_add_friends]; self.navigationItem.rightBarButtonItem =btn_add_friends_item; stateNamesArray = @[@"Alabama", @"Alaska", @"Arizona", @"Arkansas", @"California", @"Colorado", @"Connecticut", @"Delaware", @"Florida", @"Georgia", @"Hawaii", @"Idaho", @"Illinois", @"Indiana", @"Iowa", @"Kansas", @"Kentucky", @"Louisiana", @"Maine", @"Maryland", @"Massachusetts", @"Michigan", @"Minnesota", @"Mississippi", @"Missouri", @"Montana", @"Nebraska", @"Nevada", @"New Hampshire", @"New Jersey", @"New Mexico", @"New York", @"North Carolina", @"North Dakota", @"Ohio", @"Oklahoma", @"Oregon", @"Pennsylvania", @"Rhode Island", @"South Carolina", @"South Dakota", @"Tennessee", @"Texas", @"Utah", @"Vermont", @"Virginia", @"Washington", @"West Virginia", @"Wisconsin", @"Wyoming"]; NSInteger indexLabelLettersCount = [[UILocalizedIndexedCollation currentCollation] sectionTitles].count; NSMutableArray *allSections = [[NSMutableArray alloc] initWithCapacity:indexLabelLettersCount]; for (int i = 0; i < indexLabelLettersCount; i++) { [allSections addObject:[NSMutableArray array]]; } for(NSString *theState in stateNamesArray){ NSInteger sectionNumber = [[UILocalizedIndexedCollation currentCollation] sectionForObject:theState collationStringSelector:@selector(lowercaseString)]; [allSections[sectionNumber] addObject:theState]; } NSMutableArray *sortedArray = [[NSMutableArray alloc] init]; self.activeSectionIndices = [NSMutableDictionary dictionary]; self.activeSectionTitles = [NSMutableArray array]; for (int i = 0; i < indexLabelLettersCount; i++) { NSArray *statesForSection = allSections[i]; NSString *indexTitleForSection = [[UILocalizedIndexedCollation currentCollation] sectionTitles][i]; if (statesForSection.count > 0) { [self.activeSectionTitles addObject:indexTitleForSection]; NSArray *tmpSectionStates = allSections[i]; tmpSectionStates = [tmpSectionStates sortedArrayUsingSelector:@selector(compare:)]; [sortedArray addObject:tmpSectionStates]; } NSNumber *index = [NSNumber numberWithInt:MAX(self.activeSectionTitles.count - 1, 0)]; self.activeSectionIndices[indexTitleForSection] = index; } tableData = sortedArray; self.tableView.sectionHeaderHeight = 25; self.navigationController.navigationBar.translucent = NO; tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain]; self.navigationController.navigationBar.translucent = NO; self.tableView.tableFooterView = [[UIView alloc] initWithFrame:CGRectZero]; self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil]; self.tableView.tableHeaderView = self.searchController.searchBar; self.searchController.searchResultsUpdater = self; self.searchController.dimsBackgroundDuringPresentation = NO; self.searchController.hidesNavigationBarDuringPresentation = NO; self.searchController.searchBar.delegate = self; self.definesPresentationContext = YES; [self.searchController.searchBar sizeToFit]; [self.view addSubview:self.searchBar]; searchResult = [NSMutableArray arrayWithCapacity:[stateNamesArray count]]; } - (void)searchBar:(UISearchBar *)searchBar textDidChange:(nonnull NSString *)searchText { if(searchText.length == 0) { isFiltered = NO; } else { isFiltered = YES; NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF CONTAINS %@", searchText]; searchResult = [stateNamesArray filteredArrayUsingPredicate:resultPredicate]; } [self.tableView reloadData]; } - (NSInteger)numberOfSectionsInTableView: (UITableView *) tableView{ return tableData.count; } - (NSInteger)tableView: (UITableView *)tableView numberOfRowsInSection:(NSInteger)section { if(isFiltered){ return searchResult.count; } else { NSArray *arr = tableData[section]; return arr.count; } } - (UITableViewCell *) tableView:(UITableView *) tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"]; if(cell == nil){ cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"cell"]; } if(isFiltered){ cell.textLabel.text = [searchResult objectAtIndex:indexPath.row]; cell.imageView.image = [UIImage imageNamed:@"Home"]; } else{ NSArray *arr = tableData[indexPath.section];//get the current section array cell.textLabel.text = arr[indexPath.row];//get the row for the current section cell.imageView.image = [UIImage imageNamed:@"Home"]; } return cell; } -(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{ if(isFiltered) { return nil; } return self.activeSectionTitles[section]; } @end </pre></code>

3 个答案:

答案 0 :(得分:1)

您总是在numberOfSectionsInTableView中返回tableData.count,因此每一行都会重复tableData.count次。

- (NSInteger)numberOfSectionsInTableView: (UITableView *) tableView{
   return isFiltered ? 1 : tableData.count;
}


- (NSInteger)tableView: (UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
  NSArray sectionArray = (NSArray *)tableData[section];
  return isFiltered ? 1 : sectionArray.count;
}

您总是在numberOfSectionsInTableView中返回tableData.count,所以

答案 1 :(得分:0)

您需要返回正确的部分计数。

- (NSInteger)numberOfSectionsInTableView: (UITableView *) tableView{

    return isFiltered ? 1 : tableData.count;
}

我希望这会对你有所帮助。 :)

答案 2 :(得分:0)

更新此代码

 - (void)searchBar:(UISearchBar *)searchBar textDidChange:(nonnull NSString *)searchText
{ 
   //Add below line of code
    [searchText removeAllObjects];
    if(searchText.length == 0)
    {
        isFiltered = NO;
    }
    else
    {
        isFiltered = YES;
        NSPredicate *resultPredicate = [NSPredicate
                                    predicateWithFormat:@"SELF CONTAINS %@",
                                    searchText];    
        searchResult = [stateNamesArray filteredArrayUsingPredicate:resultPredicate];      
    }
    [self.tableView reloadData];
}

此方法调用每个字符,因此搜索和结果存储在数组中。您没有从数组中删除对象,因此它不断添加对象。这就是你得到这个结果的原因。

[searchText removeAllObjects];

这行代码从数组中删除所有对象。