UITableView中的多个(额外)附件选中标记

时间:2014-01-30 18:39:17

标签: ios objective-c uitableview

我有一个带有UITableView的UIViewController,它有多个附件复选标记。我的问题是,当我点击tableview中的一些单元格时,它会被检查,但是下面还会检查一些其他单元格。当我向下滚动tableview时,我可以查看它。我只希望检查用户点击的单元格,而不是额外的单元格。请让我知道我该怎么做。感谢。

以下是代码:

   - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        return 1;
    }

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return [someData count];
    }

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
        cell.textLabel.text=[self.someData objectAtIndex:indexPath.row];
        cell.textLabel.font=[UIFont fontWithName:@"Times New Roman" size:11];
        cell.textLabel.lineBreakMode = NSLineBreakByWordWrapping;
        [cell.textLabel setNumberOfLines:2];
        return cell;
    }

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
        UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];

        if ([selectedCell accessoryType] == UITableViewCellAccessoryNone) {
            [selectedCell setAccessoryType:UITableViewCellAccessoryCheckmark];    
            NSArray *arrayOfIndexPathsTableOne = [self.tableView indexPathsForSelectedRows];
            for (int i = 0; i < [arrayOfIndexPathsTableOne count]; i++) {
                NSIndexPath *indexPathImInterestedIn = [arrayOfIndexPathsTableOne objectAtIndex:i];
                UITableViewCell *currentCell = [self.tableView cellForRowAtIndexPath:indexPathImInterestedIn];
                [saveData addObject:[NSString stringWithFormat:@"%@", currentCell.textLabel.text]];
            }
         } else {
                [selectedCell setAccessoryType:UITableViewCellAccessoryNone];
                NSArray *arrayOfIndexPathsTableOne = [self.tableView indexPathsForSelectedRows];

                for(int i = 0; i < [arrayOfIndexPathsTableOne count]; i++) {
                    NSIndexPath *indexPathImInterestedIn = [arrayOfIndexPathsTableOne objectAtIndex:i];
                    UITableViewCell *currentCell = [self.tableView cellForRowAtIndexPath:indexPathImInterestedIn];
                    [saveData removeObject:[NSString stringWithFormat:@"%@", currentCell.textLabel.text]]; 
                }
         }
         [tableView deselectRowAtIndexPath:indexPath animated:NO];
    }

4 个答案:

答案 0 :(得分:0)

这是一个细胞重用问题。

要修复,请确保每次从cellForRowAtIndexPath:返回单元格时,始终设置选择(选中标记)状态。这意味着在适当的时候明确地将其设置为true和false。

答案 1 :(得分:0)

您只需要两件事:

  1. 禁用UITableView上的多项选择。
  2. setSelected:(BOOL)selected中实施UITableViewCell,并相应地选择/取消选择单元格的子视图(您的复选标记)。

答案 2 :(得分:0)

当您选择表时,您会在其上显示复选框,但是当您滚动并且单元格消失并且在您向后滚动后它进入可重复使用的池时,将从此池中取出单元格并且它不记得“状态”。 / p>

解决方案是创建NSMutableArray并在didSelectCellAtIndexPath:方法中为该数组添加或删除该单元的indexPath,并在cellForRowAtIndexPath中:检查此数组并在该表上显示/隐藏复选标记。

答案 3 :(得分:0)

不要在索引路径

的行的单元格中写入此行
[self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];

它必须位于loadview或viewdidload