在基于标签栏的应用中未调用ViewDidAppear

时间:2011-09-13 06:19:54

标签: iphone objective-c uitabbarcontroller viewdidappear

我有问题。我正在开发一个基于标签栏的应用程序。在此应用中,当我们要导航到新视图时,我们会调用[self.view addSubview:newVC.view]。 newVC是我们想要显示的新视图的视图控制器。当我们想要返回上一个视图时,我们也会使用[self.view removeFromSuperview]

换句话说,没有导航控制器。现在的问题是我想更新以前的视图。由于我们使用[self.view removeFromSuperview],之前视图的viewDidAppear未被调用,因此我们无法刷新该视图。

我知道我们使用的方法有缺陷,但由于它是一个大规模的应用程序并改变它来实现导航控制器需要花费很多时间所以我需要你帮我找到这个问题的解决方案。如何从其子视图中调用viewDidLoadviewDidAppear或上一个关于调用[self.view removeFromSuperview]的视图?

2 个答案:

答案 0 :(得分:0)

仅当您通过viewDidLoad方法跳转到控制器时,

pushViewController方法调用。如果您致电removeFromSupreView,则会调用viewWillAppear方法。如果您想通过标签栏从一个视图导航到另一个视图,则必须在UINavigationController中使用Mainwindow.xib并将其viewController与App委托连接。

答案 1 :(得分:0)

是的,正如Sarah所说,您应该在“堆栈”中保留对前一个控制器的引用。 当从堆栈“弹出”控制器时,在前一个控制器上调用适当的方法。 当然你不应该调用viewDidLoad(当你从真实UINavigationController的导航堆栈中弹出控制器时不会调用它。 您可以拨打viewWillAppearviewDidAppear,但最好使用自己的方法,例如viewRevealed(您也可以从viewWillAppearviewDidAppear调用)。它很有用 基类,实现所有这些功能,并从基类派生所有控制器。它可能看起来像:

- (void) pushViewController:(BaseViewController *)baseController{
  [self.view addSubview:baseController.view];
  baseController.parentController = self;
}
- (void) pop{
  [self.view removeFromSuperview];
  [self.parentController viewRevealed];
}