0

好的,所以我正在慢慢弄清楚这一点。我还有一个问题。我正在使用一个字符串,并说如果该字符串等于单元格文本,则在加载 tableView 时对其进行复选标记。

这是我的代码:

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

static NSString *CellIdentifier = @"Cell";
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if ([cell.textLabel.text isEqualToString:transferData]) {

    cell.accessoryType = UITableViewCellAccessoryCheckmark;

}

然后我告诉它删除该复选标记并在被选中时相应地添加复选标记:

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

cell.accessoryType = UITableViewCellAccessoryNone;

  UITableViewCell      *cellCheck = [tableView
                              cellForRowAtIndexPath:indexPath];

cellCheck.accessoryType = UITableViewCellAccessoryCheckmark;

  transferData = cellCheck.textLabel.text;
  NSLog(@"%@", transferData);
}


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

UITableViewCell* uncheckCell = [tableView
                                cellForRowAtIndexPath:indexPath];
uncheckCell.accessoryType = UITableViewCellAccessoryNone;

}

一切正常,除了第一次加载时。出于某种原因,当我在另一个单元格上选择时,最初与 tableView 一起加载的复选标记不会消失。为什么是这样?

4

2 回答 2

3

你犯了一个常见的错误。

选择单元格时,您直接设置复选标记的状态。您应该做的是在数据源中设置复选标记的状态,并让表格单元格从数据源自行配置。

排他检查表视图的编辑示例

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSArray *changedIndexPaths = nil;

    NSIndexPath *currentCheckedIndexPath = [self indexPathOfCurrentCheckedObject];

    if (currentCheckedIndexPath && ![currentCheckedIndexPath isEqual:indexPath]) {
        // There is currently a checked index path - unselect the data source and
        // add it to the changed index array.

        [[self.tableData objectAtIndex:currentCheckedIndexPath.row] setChecked:NO];
        changedIndexPaths = @[indexPath, currentCheckedIndexPath];
    } else{
        changedIndexPaths = @[indexPath];
    }

    [[self.tableData objectAtIndex:indexPath.row] setChecked:YES];

    [self.tableView reloadRowsAtIndexPaths:changedIndexPaths withRowAnimation:UITableViewRowAnimationNone];

}

我有一个新的示例应用程序,您可以下载以查看整个项目:

于 2012-11-04T01:10:17.040 回答
2

你需要:

if (self.selectedPath && [indexPath isEqual:self.selectedPath]) {
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
} else {
    cell.accessoryType = UITableViewCellAccessoryNone;
}

细胞被重复使用。如果您有条件地设置任何单元格属性,则必须始终使用“else”部分来重置属性。

编辑:在您的方法中进行上述更改后,在您的cellForRowAtIndexPath:方法中执行以下操作didSelectRowAtIndexPath:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSIndexPath *oldSelection = self.selectedPath;
    if (self.selectedPath) {
        UITableViewCell* uncheckCell = [tableView cellForRowAtIndexPath:self.selectedPath];
        uncheckCell.accessoryType = UITableViewCellAccessoryNone;
        self.selectedPath = nil;
    }

    if (oldSelection == nil || ![indexPath isEqual:oldSelection]) {
        UITableViewCell* checkCell = [tableView cellForRowAtIndexPath:indexPath];
        checkCell.accessoryType = UITableViewCellAccessoryCheckmark;
        self.selectedPath = indexPath;
    }

    [tableView deselectRowAtIndexPath:indexPath];
}

并摆脱didDeselectRowAtIndexPath:方法。

当然,您需要selectedPathtype 的属性NSIndexPath *

此代码允许您选择 0 或 1 行。

于 2012-11-04T01:03:17.623 回答