UITableView 在推送新的 viewController 时重新加载数据
Posted
技术标签:
【中文标题】UITableView 在推送新的 viewController 时重新加载数据【英文标题】:UITableView reloads data, when pushing a new viewController 【发布时间】:2014-11-08 10:43:12 【问题描述】:我有以下 VC 层次结构:ParentViewController -> Navigation Controller(child VC) -> ViewController(with UITableView)。
我遇到以下问题: 在 UITableViewDelegate.didSelectRowAtIndexPath 中,应用程序将新的 ViewController 推送到堆栈上。问题是在这个阶段,表格视图会自动重新加载,而无需任何显式调用 reloadData。这一事实产生了几个问题,例如在返回屏幕时(使用后退按钮),表格视图在开始时滚动而不是集中在选定的行上。
您能帮我找出为什么会这样吗?这是一个错误,或者如何解决这个问题?
更新:我刚刚在 ios 7.1 上测试了相同的案例,没有这样的问题,我的意思是推送一个 viewController,而不是弹回包含 UITableView 的 viewController 不会失去焦点选定的行。
【问题讨论】:
如果你使用 UITableViewController 然后设置,clearselectiononview 将显示为 NO。否则您可能必须跟踪选定的行,当 viewWillAppear 触发时,将其设置为选中并将其滚动到可见点。 它不是 UITableViewController。对于另一种情况,应用程序的架构不允许我在 viewWillAppear 中执行该操作。我也试过viewDidAppear,但是视觉上不行。 你只是推/弹出视图控制器吗?任何自定义的转场或过渡?该堆栈跟踪似乎表明电视正在更改窗口,因此正在调整大小,这会触发重新加载。 我只是在推视图控制器 我也遇到了同样的问题,当我尝试推送到视图控制器时,它正在重新加载当前屏幕表视图而不调用 reloadData。您是否找到任何解决方案或任何原因导致这种情况发生? 【参考方案1】:希望这对你有帮助。
我的解决方案是使用navigationviewcontroller委托,在推送另一个时保存选择,并在弹出时设置回来。
我的示例代码(我已将表格视图控制器设置为委托)
static NSIndexPath* path = nil;
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated
if (viewController == self)
[self.tableView reloadData];
[self.tableView selectRowAtIndexPath:path animated:NO scrollPosition:UITableViewScrollPositionMiddle];
- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated
path = self.tableView.indexPathForSelectedRow;
【讨论】:
我不认为将 NSIndexPath 设置为静态是个好主意。 当然,你可以在你的代码中设置任何你想要的东西,它只是解决这类问题的一个概念,所以我的重点是使用委托来避免iOS8中的tableview机制,而不是设置一个变量。以上是关于UITableView 在推送新的 viewController 时重新加载数据的主要内容,如果未能解决你的问题,请参考以下文章
如何从 UITableView 推送到新的 viewController?
iOS11 中奇怪的 uitableview 行为。单元格通过导航推送动画向上滚动