在APP中,我采用的是navigation+tableview的模式,因此,当cell view controller里头产生了某些数据变化的时候,tableview(root controller)应该也可以自动刷新才对。
不过,因为navigation controller的机制,tableview中点击cell后,push到新的view controller之后再想回到前一个页面,通过的是点击navigationitem的leftbutton。而这个机制则是类似PC浏览器的后退按钮而已。所以,当页面跳转到root controller的时候,需要强制刷新才可以。
而原本的做法,是
-(void)viewWillAppear:(BOOL)animated { [self.tableView reloadData]; }
不过就像刚才所说的“后退机制”,其实这个命令,并没有第二次执行,所以当在第二层cell view controller中后退到root时,并不会同步刷新。
因此,可以使用下面这个方法(在root controller的.m文件中):
-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { [self.tableView reloadData]; }
不过在此之前,需要预先设置代理,即在viewDidLoad当中预先设定好
self.navigationController.delegate = (id)self;
注意:
由于这个方法是写在root controller的.m文件中,因此每当点击cell,push进cell view controller当中时,这个方法都会被重复调用。因此,如果只想在root controller中使用此方法,本人的做法是进行判断
-(void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
if([viewController isKindOfClass:[oneController class]]) {
//新方法,用于判断所在,可以根据不同的文件进行不同的运行
[self.tableView reloadData];
} // if(navigationController.viewControllers.count == 1) {//如果为1,则代表当前处于root层 // [self.tableView reloadData]; // } }
不过此方法目前只能对root controller使用(根据判断条件),目前还未找到如何进行定制判断(对不同cell view controller的单独判断)的方法。