我的顶级UIViewController
包含UITableView
。顶级UIViewController
实例化NavigationController
,并将另一个UIViewController
推送到NavigationController
。 I.E.我们推进了新的第二种观点。第二个视图左上角有通常的“后退”按钮,可以导航回顶层视图。
当从第二个视图导航回顶级视图时,是否可以使用第二个视图中生成的数据重新绘制顶级视图中的UITableView
,方法是调用cellForRowAtIndexPath
in最高级别,如果是这样,人们如何做到这一点?
答案 0 :(得分:110)
你需要做的就是这个(在你的UIViewController中有一个UITableView)。您不必担心此时在单元级别会发生什么。
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.tableView reloadData]; // to reload selected cell
}
只需将上面的代码添加到您的控制器中,当您从第二个视图返回时,您会看到正确的事情发生。对reloadData
的调用告诉表视图它需要从模型中刷新其单元格,其他一切都很顺利。
答案 1 :(得分: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];
}
}
注意:假设您已将clearsSelectionOnViewWillAppear
设置为YES
(默认值),则必须在调用super
之前获取所选行的索引路径,这将清除选择。
此外,solution of @ZoranSimic只需拨打[self.tablView reloadData]
即可接受,因为代码更少且效率更高。
最后,保持表格视图的单元格与它们所代表的模型对象同步的最佳方法可能是NSFetchedResultsController
,并使用键值观察(KVO)和/或NSNotification
在模型对象发生更改时通知您的表视图控制器,以便它可以重新加载相应的单元格。表视图控制器可以开始在viewDidLoad
中观察对其模型对象的更改,并在dealloc
(以及manually unload self.view
的任何位置)结束观察。
答案 2 :(得分:7)
除了answer of Zoran Simic这里的Swift代码:
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
tableView.reloadData()
}
答案 3 :(得分:5)
您可以实现UINavigationControllerDelegate
的方法,并在弹出视图控制器时为刷新创建逻辑。
另一种方法是在你的表视图控制器上实现viewWillAppear
上的一些逻辑,根据弹出的视图控制器的数据进行刷新。
如果需要将数据从第二个视图控制器发送到第一个视图控制器,请记住第二个视图控制器“不知道”是否存在先前的视图控制器。它应该是透明的。您应该实现一些协议,以使第二个视图控制器将数据发送到第一个视图控制器。这将是此问题的第三个选项,因为您的第一个视图控制器将是委托,第二个视图控制器将向委托发送信息,您可能正在准备您的表视图(第一个视图控制器)以重新加载,基于收到数据。
答案 4 :(得分:3)
viewWillAppear
。
这是我的解决方案,仅在您导航回来时重新加载视图
我在.h file
的{{1}}中创建了一个变量,用于检查这是我第一次访问此ViewController
还是当我导航回来时
ViewController
之后在@property (nonatomic) BOOL isViewExist;
viewWillAppear
希望这个帮助
答案 5 :(得分:1)
现在也许可以提供帮助。
Swift 2 +
在viewDidAppear方法中:
如果您想重新加载所有表格:
tableView.reloadData()
如果您只想重新加载所选的单元格。
let index = tableView.indexPathForSelectedRow
if (index != nil){
self.tableView.reloadRowsAtIndexPaths([index], withRowAnimation: UITableViewRowAnimation.Automatic)
}
答案 6 :(得分:0)
针对Swift 3进行了更新
let index = tableView.indexPathForSelectedRow
if (index != nil){
self.tableView.reloadRows(at: [index!], with: UITableViewRowAnimation.automatic)
}