编辑时,在reloadData之后,tableview选择指示不会保留

时间:2014-11-25 23:20:23

标签: ios uitableview ios8

我在UITableView中有一个UIViewController。它的选择模式设置为SingleMultiple Selection During Editing

当我将tableView的editing属性设置为YES时,如果进程异步运行reloadData,则我选择的任何当前复选标记都会消失。我实现了tableView:cellForRowAtIndexPath:方法,以便根据selected之前的选择设置单元格的reloadData属性。我已经验证了 正确设置了。但无济于事,他们仍然没有出现选择。我需要更改什么才能正确设置?它似乎保留了缩进的编辑模式。

这是所说的方法:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"ValveCell";
    ValveCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    Valve *valve = self.sections[indexPath.section][indexPath.row];
    cell.subject = valve;
    cell.selected = [self.selections member: valve];
    return cell;
}

我使用didSelect和didDeselect方法让selectionsNSMutableSet)保持最新状态。 E.g。

- (void) tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSMutableArray *section = self.sections[indexPath.section];
    [self.selections removeObject: section[indexPath.row]];
}

澄清

鉴于答案,我认为我没有说明我指的是哪个复选标记。我指的是当表格editing设置为YES时,表格中左侧侧显示选定状态的蓝色复选标记,如此图所示:

enter image description here

如果发生reloadData,则会清除这些蓝色复选标记。

更新:我当前的解决方案

我保留视觉选择状态的做法是修改触发reloadData的KVO方法,以包含以编程方式重新选择当前选择的代码:

...
[self.tableView reloadData];
if (self.tableView.editing) {
    [self.sections enumerateObjectsUsingBlock:^(id valves, NSUInteger section, BOOL *stop) {
         [(NSArray*)valves enumerateObjectsUsingBlock:^(id valve, NSUInteger row, BOOL *stop) {
             if ([self.selections member: valve]) {
                 NSIndexPath *indexPath = [NSIndexPath indexPathForRow: row inSection: section];
                 [self.tableView selectRowAtIndexPath: indexPath animated: NO scrollPosition: UITableViewScrollPositionNone];
             }
         }];
    }];
}
...

selectRowAtIndexPath:animated:scrollPosition:方法可以完成工作。

所以在这一点上,我想我的问题是,我真的必须这样做吗?或者我工作太辛苦了?

1 个答案:

答案 0 :(得分:1)

cellForRowAtIndexPath中将单元格设置为“已选中”不会强制调用UITableView委托方法,因此,如果您正在设置复选标记,则它们不会自动显示在表视图的重新加载。

您可以直接在cellForRowAtIndexPath中添加复选标记,例如:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"ValveCell";
    ValveCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    Valve *valve = self.sections[indexPath.section][indexPath.row];
    cell.subject = valve;
    cell.selected = [self.selections member: valve];

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

    return cell;
}

或者您可以手动拨打selectRowAtIndexPath,例如:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"ValveCell";
    ValveCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];
    Valve *valve = self.sections[indexPath.section][indexPath.row];
    cell.subject = valve;
    cell.selected = [self.selections member: valve];

    if (cell.selected) {
        [self tableView:tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone]; 
    }

    return cell;
}