在我的表视图控制器的didSelectRowAtIndexPath
方法中出于某些原因,我应该调用表视图的reloadData
。在此之后,任何选择都将消失。哪种方法可以保留表的选择?
UPD:我在selectRowAtIndexPath
重新加载表后尝试didSelectRowAtIndexPath
,但它没有导致任何结果,选择仍然缺失。但是如果我会在dispatch_after
块中执行它会起作用,尽管这是一个非常奇怪的解决方案。我需要以正确的方式做到这一点。
答案 0 :(得分:0)
重新加载发生在下一个布局过程中,这通常发生在您将控制权返回到运行循环时(例如,您的按钮操作或任何返回之后)。
因此,在表视图重新加载后运行某些东西的一种方法就是强制表视图立即执行布局:
- (void)reloadTableView
{
NSArray *indexPaths = [self.tableView indexPathsForSelectedRows];
[self.tableView reloadData];
[self.tableView layoutIfNeeded];
for (NSIndexPath *path in indexPaths) {
[self.tableView selectRowAtIndexPath:path animated:NO scrollPosition:UITableViewScrollPositionNone];
}
}
或者正如您所说,您可以使用GCD安排布局后代码以便稍后运行
- (void)reloadTableView
{
NSArray *indexPaths = [self.tableView indexPathsForSelectedRows];
[self.tableView reloadData];
dispatch_async(dispatch_get_main_queue(), ^{
for (NSIndexPath *path in indexPaths) {
[self.tableView selectRowAtIndexPath:path animated:NO scrollPosition:UITableViewScrollPositionNone];
}
}
}
答案 1 :(得分:0)
在-selectRowAtIndexPath
内拨打animated
后,将NO
标记设置为[tableView reloadData]
,添加-didSelectRowAtIndexPath
。
目标-C:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
...
[tableView reloadData];
[tableView selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
...
}
夫特:
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
...
tableView.reloadData()
tableView.selectRowAtIndexPath(indexPath, animated: false, scrollPosition: .None)
...
}
答案 2 :(得分:0)
你可以使用。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
[tableView deselectRowAtIndexPath:indexPath animated:YES];
//add you code and reload the table
}
答案 3 :(得分:0)
在“didSelectRowAtIndexPath”委托方法中,保留所选indexPath的引用:
indexPathReference = indexPath;
重新加载表视图后,添加以下行:
[tableView selectRowAtIndexPath:indexPathReference animated:NO scrollPosition:UITableViewScrollPositionNone];
答案 4 :(得分:0)
在html_safe
中,您必须保留对所选indexPath的引用。
然后你应该拨打didSelectRowAtIndexPath
reloadData
会触发对reloadData
这是您使用存储的indexPath检查每个索引并将单元格设置为选中的位置。 (cellForRowAtIndexPath:
)