UITableViewCell仅在一个部分内检查/取消选中

时间:2012-10-23 18:54:28

标签: uitableview nsindexpath

我正在尝试设置我的表格,以便用户可以为每个部分选择一个项目。

例如:

- Section 0
    - Row 0 √
    - Row 1
- Section 1
    - Row 0
    - Row 1 √
    - Row 2

因此,在上面的示例中,如果用户选择section 0, row 1,则应取消选中同一部分中的row 0,并且所选行会获得复选标记。

对于第1部分也是如此,其中任何选定的行应该得到一个复选标记,然后我想从同一部分中先前选择的行中删除复选标记。

- Section 0
    - Row 0
    - Row 1 √
- Section 1
    - Row 0
    - Row 1
    - Row 2 √

请记住,我没有预定义数量的部分或行,因此代码应适用于此方案。这就是我现在所拥有的,希望这可能让我开始走上正确的道路。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
    MyObject *myObject = [self.fetchedResultsController objectAtIndexPath:indexPath];
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    if ([myObject.optionSelected boolValue] == NO) {
        [myObject setOptionSelected:[NSNumber numberWithBool:YES]];
        [cell setAccessoryType:UITableViewCellAccessoryCheckmark];
    } else {
        [myObject setOptionSelected:[NSNumber numberWithBool:NO]];
        [cell setAccessoryType:UITableViewCellAccessoryNone];
    }
    if ([tableView numberOfRowsInSection:indexPath.section] > 1) {
        NSMutableArray *cells = [[NSMutableArray alloc] init];
        for (NSInteger i = 0; i < [tableView numberOfRowsInSection:indexPath.section]; ++i) {
            [cells addObject:[tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:indexPath.section]]];
        }
        for (UITableViewCell *deselectCell in cells) {
            if ([self.tableView indexPathForCell:deselectCell] != indexPath && deselectCell != cell) {
                MyObject *tempObject = [self.fetchedResultsController objectAtIndexPath:[self.tableView indexPathForCell:deselectCell]];
                [tempObject setOptionSelected:[NSNumber numberWithBool:NO]];
                [cell setAccessoryType:UITableViewCellAccessoryNone];
            }
        }
    }
}

如您所见,我也设置了对象的选定状态,我希望保持原样:)

感谢您提前获得任何反馈和帮助!

1 个答案:

答案 0 :(得分:1)

您的tableview应该声明一个可变数组来保存当前选定的路径:

NSMutableArray *selectedCellPaths = [[NSMutableArray alloc] init];

然后你的tableView:didSelectRowAtIndexPath:应该是这样的

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES];
    MyObject *myObject = [self.fetchedResultsController objectAtIndexPath:indexPath];
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];
    if ([myObject.optionSelected boolValue] == NO) {
        [myObject setOptionSelected:[NSNumber numberWithBool:YES]];
        [cell setAccessoryType:UITableViewCellAccessoryCheckmark];
        [selectedCellPaths addObject:indexPath];
    } else {
        [myObject setOptionSelected:[NSNumber numberWithBool:NO]];
        [cell setAccessoryType:UITableViewCellAccessoryNone];
        if ([selectedCellPaths containsObject:indexPath]) {
            [selectedCellPaths removeObject:indexPath];
        }
    }

    // Now we're going to remove all but the cell path that is actually selected.

    NSMutableArray *cellsToRemove = [[NSMutableArray alloc] init];
    for (NSIndexPath *selectedCellIndexPath in selectedCellPaths) {
        if ([selectedCellIndexPath compare:indexPath] != NSOrderedSame && selectedCellIndexPath.section == indexPath.section) {
        // deselect cell at selectedCellPath
            [cellsToRemove addObject:selectedCellIndexPath];
        }
    }
    [selectedCellPaths removeObjectsInArray:cellsToRemove];
}

注意我刚刚在评论中放置了您想要取消选择未选中的单元格路径上的实际单元格的注释。您需要自己填写该代码。

我还没有测试过这段代码,只是修改了你在TextMate中所拥有的内容,但它应该可以解决一些细微的变化。