实现允许多行选择的UITableView时出现问题

时间:2010-04-15 07:40:36

标签: iphone uitableview multiple-select

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];

if (cell.accessoryType == UITableViewCellAccessoryNone) {
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
}
else {
    cell.accessoryType = UITableViewCellAccessoryNone;
}

[tableView deselectRowAtIndexPath:indexPath animated:YES];

}

...修改所选行的每个第6个单元格INSTEAD的“accessoryType”。我错过了什么?

由于

更新:这是细胞创建代码......

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *TC = @"TC";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: TC];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:PlayerTableViewCell] autorelease];
    }

    NSUInteger row = [indexPath row];
    cell.textLabel.text = [NSString stringWithFormat:@"Person %d", row+1];

    return cell;
}

我的解决方案基于下面标记的答案是......

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    // EVERY row gets its one Identifier
    NSString *TC = [NSString stringWithFormat: @"TC%d", indexPath.row];

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: TC];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:TC] autorelease];
    }

    NSUInteger row = [indexPath row];
    cell.textLabel.text = [NSString stringWithFormat:@"Person %d", row+1];

    return cell;
}

如果有更好的方式,我会全神贯注。如果我们可以根据某天传递的NSIndexPath更改SPECIFIC Cell会很好(至少对我来说这看起来更直观)。

2 个答案:

答案 0 :(得分:1)

我通过在cellForRowAtIndexPath中根据跟踪所选行的变量设置附件类型来实现它。然后在didSelectRowAtIndexPath中,我只需取消选择该行,更新变量,然后重新加载表。

代码示例:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
    }

    cell.textLabel.text = [NSString stringWithFormat:@"%d", indexPath.row];

    if ([_cells indexOfObjectIdenticalTo:_selectedCell] == indexPath.row) {
        cell.accessoryType = UITableViewCellAccessoryCheckmark;
    } else {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }

    return cell;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView deselectRowAtIndexPath:indexPath animated:NO];

    _selectedCell = [_cells objectAtIndex:indexPath.row];
    [tableView reloadData];
}

答案 1 :(得分:0)

是的,刚想通了。这些是相同的单元格(下面的日志是NSLog(@“%d%@”,行,单元格))。

2010-04-15 12:43:40.722 ...[37343:207] 0   <MyListCell: 0x124bee0; baseClass = UITableViewCell; frame = (0 0; 320 44); autoresize = RM+TM; layer = <CALayer: 0x124c3a0>>

2010-04-15 12:43:47.827 ...[37343:207] 10   <MyListCell: 0x124bee0; baseClass = UITableViewCell; frame = (0 31; 340 44); autoresize = W; layer = <CALayer: 0x124c3a0>>

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: PlayerTableViewCell];

dequeueReusableCellWithIdentifier使用已创建的单元格,如果前一个单元格不在屏幕上。

因此,您应该避免使用“dequeueReusableCellWithIdentifier” - 创建字典NSIndexPath - &gt; UITableViewCell并使用它而不是dequeueReusableCellWithIdentifier。

<强>增加: 您还可以检查winsNumbers数组中是否存在(rowNumber + 1)并替换tableView:cellForRowAtIndexPath:方法中的附件。这也应该有用