2014-01-23 115 views
0

我知道這裏有很多類似的問題,但沒有解決我的問題。在我的UITableView中有很多部分,當我單擊/勾選單元格中的某些按鈕並向下滾動時,複選標記在再次滾動時消失。這是我編碼..滾動UITableView重置單元格的複選框按鈕狀態

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *cellId = @"CheckBoxedCell"; 
    // NSString *cellId = [NSString stringWithFormat:@"Section:%d Row:%d",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]; 

    } 

     SaveCheckBoxedView *saveContact; 
     if(isFiltered == YES) 
     { 
      saveContact = [filterdArray objectAtIndex:indexPath.row]; 
      cell.nameLabel.text = saveContact.nameString; 
     } 
     else 
     { 
      saveContact = [mutableArray objectAtIndex:indexPath.row]; 
      cell.nameLabel.text = [[objectsForCharacters objectForKey:[arrayOfCharacters objectAtIndex:indexPath.section]] objectAtIndex:indexPath.row]; 
     } 


     cell.companyLabel.text = saveContact.companyString; 
     cell.invIdLabel.text = [NSString stringWithFormat:@"%@", saveContact.invitId]; 

     //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; 


    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]; 

    checkBox.tag = rowNumber; 

    [cell.contentView addSubview:checkBox]; 

    // handle check box view reset when scrolled 

    for(NSIndexPath *path in checkedIndexPaths) 
    { 
     if(path.section == indexPath.section && path.row == indexPath.row) 
     { 
      if(!checkedIndexPaths) 
      { 
       checkedIndexPaths = [[NSMutableSet alloc] init]; 
       [checkedIndexPaths addObject:[NSNumber numberWithInt:rowNumber]]; 
      } 
     } 
    } 

    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]; 
     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"); 

     [arrayOfIds removeObjectAtIndex:tappedButton.tag]; 
    } 

} 

回答

0

如果我沒有弄錯,你從來沒有設置checkBox.checked?

0

當您向上和向下滾動時,只有可見的單元格將被出列和配置。因此,無論何時向下滾動整頁,然後重新生成單元格都將被重新創建(您可以在cellForRowAtIndexPath的入口點NSLog查看我的意思)。

在此方法中重新創建按鈕。請記住,表視圖單元格是緩存因此,如果您創建了一個單元格,它可能會在需要時再次使用,因此只有在第一次創建單元格時才創建按鈕,而不是每次調用cellForRowAtIndexPath時都創建該按鈕。

如果使用自定義單元格可以添加boolean成員,表明細胞已經創建並沒有必要再添新創建的按鈕,將隱藏你原來當你[cell.contentView addSubview:checkBox];(或更好的將其添加但在這個自定義單元格的init方法中做按鈕創建將更加容易和正確)

0

我用來實現與按鈕類似的東西。因此,在單元格內部,您可以定義一個函數,用於更改複選框的背景或基於模型的複選框的狀態。

-(void) setModel:(Model *)model { 

    [self.button setSomeStyleBasedOnYourModel];   
} 

如果在故事板的tableview中有該複選框,則可以將故事板中的目標鏈接到控制器。

- (IBAction)doTaskButtonPressed:(UIButton *)sender { 
    [super doTaskButtonPressed:sender]; 
}