导航回来时重新加载UITableView?

Jam*_*sta 54 navigation iphone objective-c

我有一个UIViewController包含a 的顶级UITableView.顶级UIViewController实例化a NavigationController,并将另一个推UIViewController送到NavigationController.IE我们推进了新的第二种观点.第二个视图在左上角有通常的"后退"按钮,允许您导航回顶层视图.

当从第二个视图导航回顶层视图时,是否有可能UITableView使用在第二个视图中生成的数据重新绘制顶层视图,通过调用cellForRowAtIndexPath顶层,如果是,那么如何执行此操作?

Zor*_*mic 111

你需要做的就是这个(在你的UIViewController中有一个UITableView).您不必担心此时在单元级别会发生什么.

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    [self.tableView reloadData]; // to reload selected cell
}
Run Code Online (Sandbox Code Playgroud)

只需将上面的代码添加到控制器中,当您从第二个视图返回时,您将看到正确的事情发生.调用reloadData告诉表视图它需要从模型中刷新其单元格,其他一切都很顺利.


ma1*_*w28 12

如果您只想重新加载所选的单元格,请覆盖viewWillAppear:自定义子类,UITableViewController如下所示:

- (void)viewWillAppear:(BOOL)animated
{
    NSIndexPath *selectedRowIndexPath = [self.tableView indexPathForSelectedRow];
    [super viewWillAppear:animated]; // clears selection
    if (selectedRowIndexPath) {
        [self.tableView reloadRowsAtIndexPaths:@[selectedRowIndexPath] withRowAnimation:UITableViewRowAnimationNone];
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:假设您已将clearsSelectionOnViewWillAppearset设置为YES(默认值),则必须在调用之前获取所选行的索引路径super,这将清除选择.

此外,@ ZoranSimic解决方案只是调用[self.tablView reloadData]是可以接受的,因为它的代码更少且效率更高.

最后,也许保持表视图的单元格与它们所代表的模型对象同步的最佳方法是NSFetchedResultsController使用键值观察(KVO)和/或NSNotification在模型对象发生更改时通知表视图控制器可以重新加载相应的单元格.表视图控制器可以开始观察其模型对象的更改viewDidLoad和结束观察dealloc(以及您手动卸载的self.view任何位置).


Mic*_*ner 7

除了Zoran Simic答案, Swift代码:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    tableView.reloadData()
}
Run Code Online (Sandbox Code Playgroud)


vfn*_*vfn 5

UINavigationControllerDelegate弹出视图控制器时,您可以实现刷新的方法并创建刷新逻辑.

另一种方法是在你的表视图控制器上实现一些逻辑viewWillAppear,根据弹出的视图控制器的数据进行刷新.

如果需要将数据从第二个视图控制器发送到第一个视图控制器,请记住第二个视图控制器"不知道"是否存在先前的视图控制器.它应该是透明的.您应该实现一些协议,以使第二个视图控制器将数据发送到第一个视图控制器.这将是此问题的第三个选项,因为您的第一个视图控制器将是委托,第二个视图控制器将向委托发送信息,您可能正在准备您的表视图(第一个视图控制器)以重新加载,基于收到的数据.