使用UISearchBar时保留UITableView单元状态

我正在使用UISearchBar在UITableView单元格中search名称。 在UISearchBar中input字符时如何保留单元格状态?

我分配了cellForRowAtIndexPath的checkbox,并假设我做出了如下面截图所示的select。

在这里输入图像说明

现在,如果我开始search字母'S',checkbox状态是'unchecked',如下所示。

在这里输入图像说明

即使单元在search时被“过滤”,我如何保留checkBox状态。 我知道,每当我们在UISearchBar中input文本, cellForRowAtIndexPath被调用。 以下是我的cellForRowAtIndexPath方法。

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { //static NSString *cellId = @"CheckBoxedCell"; NSString *cellId = [NSString stringWithFormat:@"S%1dR%1d",indexPath.section,indexPath.row]; CheckBoxedCellClass *cell = (CheckBoxedCellClass *)[self.tableViewContact dequeueReusableCellWithIdentifier:cellId]; if(!cell) { NSArray *nib; if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { nib = [[NSBundle mainBundle] loadNibNamed:@"CheckBoxedCellClass" owner:self options:nil]; } else if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { nib = [[NSBundle mainBundle] loadNibNamed:@"CheckBoxedCellClass_iPad" owner:self options:nil]; } for (id object in nib) { if([object isKindOfClass:[CheckBoxedCellClass class]]) { cell = (CheckBoxedCellClass *)object; break; } } cell = [nib objectAtIndex:0]; } //handling check box NSInteger rowNumber = 0; for(NSInteger i = 0; i < indexPath.section ; i++) { rowNumber += [self tableView:self.tableViewContact numberOfRowsInSection:i]; } rowNumber += indexPath.row; SaveCheckBoxedView *saveContact; if(isFiltered == YES) { saveContact = [filterdArray objectAtIndex:indexPath.row]; cell.nameLabel.text = saveContact.nameString; cell.companyLabel.text = saveContact.companyString; } else { saveContact = [mutableArray objectAtIndex:indexPath.row]; cell.nameLabel.text = [[objectsForCharacters objectForKey:[arrayOfCharacters objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row]; cell.companyLabel.text = [NSString stringWithFormat:@"%@", [companyArray objectAtIndex:rowNumber]]; } cell.invIdLabel.text = [NSString stringWithFormat:@"%@", saveContact.invitId]; UIButton *checkBox; if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { checkBox = [[UIButton alloc]initWithFrame:CGRectMake(7, 8, 30, 30)]; } else { checkBox = [[UIButton alloc]initWithFrame:CGRectMake(15, 13, 30, 30)]; } [checkBox setImage:[UIImage imageNamed:@"checkBox.png"] forState:UIControlStateNormal]; [checkBox addTarget:self action:@selector(checkBoxClicked:event:) forControlEvents:UIControlEventTouchUpInside]; // handle check box view reset when scrolled if(isFiltered == YES) { NSLog(@"filtered"); checkBox.tag = indexPath.row; BOOL buttonPressed = [[boolDict objectForKey:[NSString stringWithFormat:@"%d", indexPath.row]] boolValue]; NSLog(@"Row number = %d", indexPath.row); [checkBox setSelected:buttonPressed]; if(buttonPressed) { [checkBox setImage:[UIImage imageNamed:@"checkBoxMarked.png"] forState:UIControlStateNormal]; } else { [checkBox setImage:[UIImage imageNamed:@"checkBox.png"] forState:UIControlStateNormal]; } } else { BOOL buttonPressed = [[boolDict objectForKey:[NSString stringWithFormat:@"%d", rowNumber]] boolValue]; NSLog(@"Row number = %d", rowNumber); [checkBox setSelected:buttonPressed]; if(buttonPressed) { [checkBox setImage:[UIImage imageNamed:@"checkBoxMarked.png"] forState:UIControlStateNormal]; } else { [checkBox setImage:[UIImage imageNamed:@"checkBox.png"] forState:UIControlStateNormal]; } checkBox.tag = rowNumber; } [cell.contentView addSubview:checkBox]; return cell; } -(void)checkBoxClicked:(id)sender event:(id)event { NSSet *touches = [event allTouches]; UITouch *touch = [touches anyObject]; CGPoint currentTouchPosition = [touch locationInView:self.tableViewContact]; NSIndexPath *indexPath = [self.tableViewContact indexPathForRowAtPoint: currentTouchPosition]; NSLog(@"value of indexPath.section %d ,indexPath.row %d",indexPath.section,indexPath.row); UIButton *tappedButton = (UIButton*)sender; NSLog(@"Tag number = %d", [sender tag]); if([tappedButton.currentImage isEqual:[UIImage imageNamed:@"checkBox.png"]]) { [sender setImage:[UIImage imageNamed: @"checkBoxMarked.png"] forState:UIControlStateNormal]; NSUserDefaults *buttonDefault = [NSUserDefaults standardUserDefaults]; [buttonDefault setBool:YES forKey:@"CHECKMARKEDKEY"]; [self.boolDict setObject:[NSNumber numberWithBool:YES] forKey:[NSString stringWithFormat:@"%d", [sender tag]]]; if(isFiltered == YES) { NSString *addId = [filteredArrayOfIds objectAtIndex:indexPath.row]; NSLog(@"filterd id = %@", addId); //get filtered array here [arrayOfIds addObject:addId]; } else { NSString *finalIntId = [mutableArrayOfIds objectAtIndex:tappedButton.tag]; NSLog(@"Tagged checked button id = %@", finalIntId); [arrayOfIds addObject:finalIntId]; } } else { [sender setImage:[UIImage imageNamed:@"checkBox.png"]forState:UIControlStateNormal]; NSLog(@"UnChecked"); [self.boolDict setObject:[NSNumber numberWithBool:NO] forKey:[NSString stringWithFormat:@"%d", [sender tag]]]; if(isFiltered == YES) { [arrayOfIds removeObjectIdenticalTo:[filteredArrayOfIds objectAtIndex:tappedButton.tag]]; } else { [arrayOfIds removeObjectIdenticalTo:[mutableArrayOfIds objectAtIndex:tappedButton.tag]]; } } } 

UISearhBar方法如下

 - (void)searchBarCancelButtonClicked:(UISearchBar *)searchBar { searchBar.text=@""; [searchBar setShowsCancelButton:NO animated:YES]; [searchBar resignFirstResponder]; [self.tableViewContact reloadData]; [self.tableViewContact scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES]; } - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText { if(searchText.length == 0) { isFiltered = NO; } else { isFiltered = YES; filterdArray = [[NSMutableArray alloc] init]; filteredArrayOfIds = [[NSMutableArray alloc] init]; for (SaveCheckBoxedView *contact in mutableArray) { NSRange nameRange = [contact.nameString rangeOfString:searchText options:NSCaseInsensitiveSearch]; if(nameRange.location != NSNotFound) { [filterdArray addObject:contact]; [filteredArrayOfIds addObject:contact.invitId]; } } } [self.tableViewContact reloadData]; } - (void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar { [searchBar setShowsCancelButton:NO animated:YES]; } - (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar { [self.mySearchBar resignFirstResponder]; [mySearchBar setShowsCancelButton:NO animated:YES]; } - (void) searchDisplayController:(UISearchDisplayController *)controller didLoadSearchResultsTableView:(UITableView *)tableView { [tableViewContact registerClass:[CheckBoxedCellClass class] forCellReuseIdentifier:@"SaveContactCellID"]; } - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString { [filterdArray removeAllObjects]; if(searchString.length > 0) { NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF contains [search] %@", self.mySearchBar.text]; for (NSString *key in arrayOfCharacters) { NSArray *matches = [objectsForCharacters[key] filteredArrayUsingPredicate:predicate]; [filterdArray addObjectsFromArray:matches]; } } return YES; } - (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller { [self.tableViewContact reloadSectionIndexTitles]; } 

用下面的代码解决了我自己的问题

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { //static NSString *cellId = @"CheckBoxedCell"; NSString *cellId = [NSString stringWithFormat:@"S%1dR%1d",indexPath.section,indexPath.row]; CheckBoxedCellClass *cell = (CheckBoxedCellClass *)[self.tableViewContact dequeueReusableCellWithIdentifier:cellId]; if(!cell) { NSArray *nib; if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { nib = [[NSBundle mainBundle] loadNibNamed:@"CheckBoxedCellClass" owner:self options:nil]; } else if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { nib = [[NSBundle mainBundle] loadNibNamed:@"CheckBoxedCellClass_iPad" owner:self options:nil]; } for (id object in nib) { if([object isKindOfClass:[CheckBoxedCellClass class]]) { cell = (CheckBoxedCellClass *)object; break; } } cell = [nib objectAtIndex:0]; } //set fonts if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { [cell.companyLabel setFont:[UIFont italicSystemFontOfSize:10.0]]; } else { [cell.companyLabel setFont:[UIFont italicSystemFontOfSize:14.0]]; } //handling check box NSInteger rowNumber = 0; for(NSInteger i = 0; i < indexPath.section ; i++) { rowNumber += [self tableView:self.tableViewContact numberOfRowsInSection:i]; } rowNumber += indexPath.row; SaveCheckBoxedView *saveContact; if(isFiltered == YES) { saveContact = [filterdArray objectAtIndex:indexPath.row]; cell.nameLabel.text = saveContact.nameString; cell.companyLabel.text = saveContact.companyString; } else { saveContact = [mutableArray objectAtIndex:indexPath.row]; cell.nameLabel.text = [[objectsForCharacters objectForKey:[arrayOfCharacters objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row]; cell.companyLabel.text = [NSString stringWithFormat:@"%@", [companyArray objectAtIndex:rowNumber]]; } cell.invIdLabel.text = [NSString stringWithFormat:@"%@", saveContact.invitId]; UIButton *checkBox; if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { checkBox = [[UIButton alloc]initWithFrame:CGRectMake(7, 8, 30, 30)]; } else { checkBox = [[UIButton alloc]initWithFrame:CGRectMake(15, 13, 30, 30)]; } [checkBox setImage:[UIImage imageNamed:@"checkBox.png"] forState:UIControlStateNormal]; [checkBox addTarget:self action:@selector(checkBoxClicked:event:) forControlEvents:UIControlEventTouchUpInside]; // handle check box view reset when scrolled if(isFiltered == YES) { NSLog(@"filtered"); BOOL buttonPress = [[boolDictForSearch objectForKey:[filteredArrayOfIds objectAtIndex:indexPath.row]] boolValue]; NSLog(@"button press = %d", buttonPress); [checkBox setSelected:buttonPress]; if(buttonPress) { [checkBox setImage:[UIImage imageNamed:@"checkBoxMarked.png"] forState:UIControlStateNormal]; } else { [checkBox setImage:[UIImage imageNamed:@"checkBox.png"] forState:UIControlStateNormal]; } checkBox.tag = indexPath.row; } else { BOOL buttonPressed = [[boolDict objectForKey:[NSString stringWithFormat:@"%d", rowNumber]] boolValue]; NSLog(@"button pressED = %d", buttonPressed); NSLog(@"Row number = %d", rowNumber); [checkBox setSelected:buttonPressed]; if(buttonPressed) { [checkBox setImage:[UIImage imageNamed:@"checkBoxMarked.png"] forState:UIControlStateNormal]; } else { [checkBox setImage:[UIImage imageNamed:@"checkBox.png"] forState:UIControlStateNormal]; } checkBox.tag = rowNumber; } [cell.contentView addSubview:checkBox]; return cell; } -(void)checkBoxClicked:(id)sender event:(id)event { NSSet *touches = [event allTouches]; UITouch *touch = [touches anyObject]; CGPoint currentTouchPosition = [touch locationInView:self.tableViewContact]; NSIndexPath *indexPath = [self.tableViewContact indexPathForRowAtPoint: currentTouchPosition]; NSLog(@"value of indexPath.section %d ,indexPath.row %d",indexPath.section,indexPath.row); UIButton *tappedButton = (UIButton*)sender; NSLog(@"Tag number = %d", [sender tag]); if([tappedButton.currentImage isEqual:[UIImage imageNamed:@"checkBox.png"]]) { [sender setImage:[UIImage imageNamed: @"checkBoxMarked.png"] forState:UIControlStateNormal]; NSUserDefaults *buttonDefault = [NSUserDefaults standardUserDefaults]; [buttonDefault setBool:YES forKey:@"CHECKMARKEDKEY"]; [self.boolDict setObject:[NSNumber numberWithBool:YES] forKey:[NSString stringWithFormat:@"%d", [sender tag]]]; //[self.boolDictForSearch setObject:[NSNumber numberWithBool:YES] forKey:[NSString stringWithFormat:@"%@", saveContact.nameString]]; if(isFiltered == YES) { NSString *addId = [filteredArrayOfIds objectAtIndex:indexPath.row]; [self.boolDictForSearch setObject:[NSNumber numberWithBool:YES] forKey:addId]; NSLog(@"filterd id = %@", addId); //get filtered array here [arrayOfIds addObject:addId]; } else { NSString *finalIntId = [mutableArrayOfIds objectAtIndex:tappedButton.tag]; [self.boolDictForSearch setObject:[NSNumber numberWithBool:YES] forKey:finalIntId]; NSLog(@"Tagged checked button id = %@", finalIntId); [arrayOfIds addObject:finalIntId]; } } else { [sender setImage:[UIImage imageNamed:@"checkBox.png"]forState:UIControlStateNormal]; NSLog(@"UnChecked"); [self.boolDict setObject:[NSNumber numberWithBool:NO] forKey:[NSString stringWithFormat:@"%d", [sender tag]]]; //[self.boolDictForSearch setObject:[NSNumber numberWithBool:NO] forKey:[NSString stringWithFormat:@"%@", saveContact.nameString]]; if(isFiltered == YES) { [arrayOfIds removeObjectIdenticalTo:[filteredArrayOfIds objectAtIndex:tappedButton.tag]]; [self.boolDictForSearch setObject:[NSNumber numberWithBool:NO] forKey:[filteredArrayOfIds objectAtIndex:tappedButton.tag]]; } else { [arrayOfIds removeObjectIdenticalTo:[mutableArrayOfIds objectAtIndex:tappedButton.tag]]; [self.boolDictForSearch setObject:[NSNumber numberWithBool:NO] forKey:[mutableArrayOfIds objectAtIndex:tappedButton.tag]]; } } }