有关UINavigation的东东

在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的单独判断)的方法。

posted @ 2012-08-27 12:07  小龙酸菜  阅读(273)  评论(0编辑  收藏  举报