1

我想制作一个UITableView用于选择选项(一次一个复选标记附件),例如在“设置”应用程序中(例如为笔记选择字体)。

我一直在阅读其他线程,确保我在方法中重置了附件类型cellForIndexPath,并且我deselectCell...didSelect...方法中这样做了。但是,我只能使用[tableView reloadData].

不幸的是,这取消/缩短了该[tableView deselectRowAtIndexPath: animated:]方法。有没有办法实现这一点,而无需在所有行中使用原始循环?

4

2 回答 2

1

尝试这样的事情:

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // In cellForRow... we check this variable to decide where we put the checkmark
    self.checkmarkedRow = indexPath.row;

    // We reload the table view and the selected row will be checkmarked
    [tableView reloadData];

    // We select the row without animation to simulate that nothing happened here :)
    [tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];

    // We deselect the row with animation
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}
于 2013-06-11T23:29:02.447 回答
1

如果您一次只允许一个复选标记,您可以将当前选择的 indexPath(或合适的代理)保留在一个属性中,然后您只需要更新两行。

否则,你将不得不循环。通常,我有一个configureCell:atIndexPath:可以从任何地方(包括cellForRowAtIndexPath)调用的方法和一个reloadVisibleCells方法:

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
    //cell configuration logic
}

- (void)reconfigureVisibleCells
{
    for (UITableViewCell *cell in [self.tableView visibleCells]) {
        NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
        [self configureCell:cell atIndexPath:indexPath];
    }
}

begin/endUpdates或者,如果您想拥有内置的行动画,您可以使用更传统的方法在三明治中重新加载单元格:

- (void)reloadVisibleCells
{
    [self.tableView beginUpdates];
    NSMutableArray *indexPaths = [NSMutableArray array];
    for (UITableViewCell *cell in [self.tableView visibleCells]) {
        NSIndexPath *indexPath = [self.tableView indexPathForCell:cell];
        [indexPaths addObject:indexPath];
    }
    [self.tableView reloadRowsAtIndexPaths:indexPaths withRowAnimation:UITableViewRowAnimationFade];
    [self.tableView endUpdates];
}
于 2013-06-12T02:14:59.020 回答