在UITableView中一次只允许一行检查,保留动画

时间:2013-06-11 23:12:08

标签: ios objective-c cocoa-touch uitableview

我想要UITableView选择选项(一次选中一个复选标记附件),就像设置应用中一样(例如选择Notes的字体)。

我一直在阅读其他主题,确保我在cellForIndexPath方法中重置附件类型,并在deselectCell...方法中执行didSelect...。但是,我只能使用[tableView reloadData]来“刷新”表格。

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

2 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分: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];
}