我想要UITableView
选择选项(一次选中一个复选标记附件),就像设置应用中一样(例如选择Notes的字体)。
我一直在阅读其他主题,确保我在cellForIndexPath
方法中重置附件类型,并在deselectCell...
方法中执行didSelect...
。但是,我只能使用[tableView reloadData]
来“刷新”表格。
不幸的是,取消/缩短[tableView deselectRowAtIndexPath: animated:]
方法。有没有办法实现这一点,在所有行中没有原始循环?
答案 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];
}