复选框UITableView项目

时间:2010-11-14 20:16:34

标签: iphone objective-c

我正在尝试查看uitableview的项目,但我遇到两个困难: 1.我无法选择第一项 2.如果我选择第2和第3项,这也将在第5和第7,第9和第10等附近设置复选标记等

以下是我的代码:

#pragma mark -
#pragma mark Table View Data Source Methods
- (NSInteger)tableView:(UITableView *)tableView
 numberOfRowsInSection:(NSInteger)section {
    return [self.listArray count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CustomCellIdentifier = @"CustomCellIdentifier";

    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:CustomCellIdentifier];
    if (cell == nil)
    {
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCell" owner:self options:nil];
        for (id oneObject in nib)
            if ([oneObject isKindOfClass:[CustomCell class]]) {
                cell = (CustomCell *)oneObject;
            }
    }


    NSUInteger row = [indexPath row];


    if ([selectedArray containsObject:cell])
    {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    }
    else {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    [cell reloadInputViews];

    return cell;
}

- (NSIndexPath *)tableView:(UITableView *)tableView
  willSelectRowAtIndexPath:(NSIndexPath *) indexPath{
    NSUInteger row = [indexPath row];
    if (row == 0)
        return nil;
    return indexPath;
}

- (void)tableView:(UITableView *)tableView
didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSUInteger row = [indexPath row];

    UITableViewCell *c = [tableView cellForRowAtIndexPath:indexPath];
    if ([selectedArray containsObject:c])
    {
        c.accessoryType = UITableViewCellAccessoryNone;
        [selectedArray removeObject:c];
        [selectedIndexes removeObject:[NSNumber numberWithInt:row]];
    }
    else {
        c.accessoryType = UITableViewCellAccessoryCheckmark;
        [selectedArray addObject:c];
        [selectedIndexes addObject:[NSNumber numberWithInt:row]];
    }
}

- (CGFloat) tableView:(UITableView *)tableView
heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return kTableViewRowHeight;
}

- (void)refreshDisplay:(UITableView *)tableView {
    [tableView reloadData]; 
}

我尝试使用

NSString *identifier = [NSString stringWithFormat:@"Cell %d", indexPath.row];

    CustomCell *cell = (CustomCell *)[tableView dequeueReusableCellWithIdentifier:identifier]; 
相反,但是滚动时使复选标记消失

2 个答案:

答案 0 :(得分:2)

您的逻辑假定每行都有自己唯一的单元格对象。但是,dequeueReusableCellWithIdentifier填充意味着您重复使用单元格对象(即当单元格从屏幕顶部滚动时,它会在屏幕底部重复使用)。你需要重做你的逻辑,不要做出这个假设。

此外,if (row == 0) return nil;中的willSelectRowAtIndexPath是您无法选择第一行的原因。摆脱这条线。

答案 1 :(得分:1)

由于这个原因,您无法选择第一项:

- (NSIndexPath *)tableView:(UITableView *)tableView
  willSelectRowAtIndexPath:(NSIndexPath *) indexPath{
    NSUInteger row = [indexPath row];
    if (row == 0)
        return nil;
    return indexPath;
}

其余的,不存储单元格,存储索引路径。细胞可以重复使用,这迟早会引起问题。也许这会导致你现在遇到的问题。并将这些索引路径保存在NSMutableSet