2014-02-11 2 views
0

Я использую UISearchBar для поиска имен в ячейках UITableView. Как сохранить состояние ячейки, когда charachters введены в UISearchBar?Сохранять состояние ячейки UITableView при использовании UISearchBar

Я выделил флажок в cellForRowAtIndexPath и предположим, что сделал выбор, как показано на скриншоте ниже.

enter image description here

Теперь, если я начну искать с буквы «S», CheckBox состояние «бесконтрольно», как можно увидеть ниже.

enter image description here

Как сохранить состояние CheckBox даже если клетки «отфильтрованные» при поиске. Я знаю, что cellForRowAtIndexPath вызывается каждый раз, когда мы вводим текст в UISearchBar. Ниже мой метод 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 
{ 
    [email protected]""; 

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

Ваш код довольно долго (слишком долго имо), так что я просто сделать несколько мыслей ... Где вы храните, что ячейка проверена? Вы можете сохранить его в своем источнике данных .. или создать массив, в котором хранятся все выбранные объекты (а не объекты ячейки ..). Добавьте затем в свой 'cellForRowAtIndexPath' вы можете сравнить' if self.selectedObjects, содержащий объект, затем установите флажок или что-то подобное – Marc

+0

Я использую пару ключ-значение. Просто посмотрите на «boolDict», который является «NSMutableDictionary» в cellForRowAtIndexPath, чтобы сохранить проверенное состояние checkBox. –

+1

Если я правильно понимаю, ваш ключ - номер строки, ваше значение - bool. Если вы проверите свою пятую запись, будет что-то вроде '@ {@ 5: @YES}'. Но если вы отфильтруете свою таблицу, 5-я ячейка станет первой ячейкой. Поэтому вам следует использовать лучший ключ ('SaveCheckBoxedView', кажется, ваш объект источника данных (странное имя btw), возможно, его сохранит) – Marc

ответ

0

решаемые мой собственный вопрос со следующим кодом

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

ребята Я следил за этим руководством, и все работало, я только проблема ... когда я выбираю проверку в нормальном режиме, когда я перейдите в режим поиска (используя UISearchBar) предыдущая проверка не больше "отображается как непроверенные возвращения ... Где я делаю неправильно? – kAiN

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