在UINavigationController中第一次加载视图控制器的事件?

时间:2011-09-14 19:12:29

标签: ios uinavigationcontroller

首次展示我的视图控制器时,我希望它可能更新为该视图提供数据的缓存。但是,当用户从较深的视图控制器点击后退按钮以返回到此视图控制器时,我不想再次更新缓存。

我应该使用哪个活动?

  • init中,我还没有我需要的所有参数。
  • 每次出现视图时都会触发
  • viewWillAppear
  • 每次从笔尖加载视图时,
  • viewDidLoad都会被触发,我相信如果有内存警告,可能会再次发生这种情况。 (或者这是错的吗?)由于这是内存驻留缓存,因此处理此问题似乎是错误的。
  • 让调用者调用额外的东西是不优雅的,如果有一种内置的方法来处理它。

为了澄清,这不是内存驻留缓存。这是将XML文件解析为二进制文件。二进制文件在viewDidLoadviewDidUnload中加载和卸载。这是该步骤的先决条件,确保二进制文件在加载之前是最新的。

2 个答案:

答案 0 :(得分:1)

使用init可能有效,但我建议使用UINavigationController的简单子类。创建一个名为setRootTableViewController:(UITableViewController *)controller的新方法,或类似的方法。在方法实现中,请调用:

[controller.tableView reloadData];
[self pushViewController:controller animated:NO];

reloadData将调用所有委托和数据源方法,并使用它们来更新表。如果您希望在表视图控制器上调用特殊方法,则可以将方法声明更改为setRootTableViewController:(CustomTableViewController *)controller(或调用任何自定义表控制器),并将reloadData行替换为调用那种方法。

然后,在您的app委托中,不是创建UINavigationController并添加自定义视图控制器,而是创建其中一个,并调用此方法添加第一个视图。

但是,如果您使用nib设置rootViewController,则可以覆盖initWithRootViewController:(UIViewController *)controller,因为我想这是nib将调用以设置堆栈中的第一个视图:< / p>

- (id)initWithRootViewController:(UIViewController *)rootViewController {
  if ((self = [super init])) {
    [(CustomController *)rootViewController doSomethingSpecial];
    [self pushViewController:rootViewController];
  }
}

希望这有帮助!

答案 1 :(得分:0)

在viewDidLoad中加载缓存并在viewDidUnload和dealloc中释放它。

在内存不足的情况下调用viewDidUnload。 如果你希望你的应用程序保持响应,你就可以释放尽可能多的内存。

在这里解释得很好:When should I release objects in -(void)viewDidUnload rather than in -dealloc?