xse*_*see 37 objective-c uitableview ios ios7
当用户点击我的一行中的按钮时,我正在更新该行的基础模型,然后为给定行调用reloadRowsAtIndexPaths(即单行重新加载).
- (IBAction)handleCompleteTouchEvent:(UIButton *)sender {
NSIndexPath *indexPath = [self.tableView indexPathForView:sender];
id item = [self dataForIndexPath:indexPath];
if ([item respondsToSelector:@selector(completed)]) {
// toogle completed value
BOOL completed = ![[item valueForKey:@"completed"] boolValue];
[item setValue:[NSNumber numberWithBool:completed] forKey:@"completed"];
[self.tableView beginUpdates];
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
[self.tableView endUpdates];
}
}
Run Code Online (Sandbox Code Playgroud)
问题是在进行此调用后,表视图会弹回到该部分的顶部.如何防止这种情况发生并将滚动位置保持在原位?
xse*_*see 47
啊哈!我发现了这个问题,我将回答自己的问题,为将来遇到这个问题的可怜的灵魂.
我的所有单元格都有可变高度,所以我在UITableViewDelegate中使用新的iOS7方法,认为它可能会加快渲染时间(不是我真的需要它):
- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath;
Run Code Online (Sandbox Code Playgroud)
无论如何,实现这种方法有一个邪恶的副作用,导致表调用时反弹到该部分的顶部:
[self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone];
Run Code Online (Sandbox Code Playgroud)
为了解决反弹问题,我刚刚删除了estimatedHeightForRowAtIndexPath方法的覆盖,现在一切正常.终于快乐了.
小智 5
这对我有用。
UIView.setAnimationsEnabled(false)
tableView.reloadRows(at: [...], with: .none)
UIView.setAnimationsEnabled(true)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
10678 次 |
| 最近记录: |