我在UITableView
中有一个UIViewController
。它的选择模式设置为Single
和Multiple 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方法让selections
(NSMutableSet
)保持最新状态。 E.g。
- (void) tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
NSMutableArray *section = self.sections[indexPath.section];
[self.selections removeObject: section[indexPath.row]];
}
鉴于答案,我认为我没有说明我指的是哪个复选标记。我指的是当表格editing
设置为YES
时,表格中左侧侧显示选定状态的蓝色复选标记,如此图所示:
如果发生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:
方法可以完成工作。
所以在这一点上,我想我的问题是,我真的必须这样做吗?或者我工作太辛苦了?
答案 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;
}