ios - 在 UINavigationController 中首次加载 View Controller 的事件?

标签 ios uinavigationcontroller

当我的 View Controller 首次出现时,我希望它有可能更新为该 View 提供数据的缓存。但是,当用户从更深的 View Controller 点击后退按钮返回到该 View Controller 时,我不想再次更新缓存。

我应该使用哪个事件?

  • init 中,我还没有我需要的所有参数。
  • viewWillAppear 将在每次 View 出现时触发。
  • viewDidLoad 将在每次从 nib 加载 View 时触发,我相信如果出现内存警告,这可能会发生第二次。 (或者这是错误的?)由于这不是内存驻留缓存,因此处理这个问题的地方似乎是错误的。
  • 让调用者调用一些额外的东西是不优雅的,如果有一个内置的方法来处理这个。

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

最佳答案

使用 init可能有用,但我会推荐一个简单的子类 UINavigationController .创建一个名为 setRootTableViewController:(UITableViewController *)controller 的新方法, 或类似的东西。在方法实现中调用这个:

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

reloadData将调用所有委托(delegate)和数据源方法,并使用它们更新表。如果你想在你的 TableView Controller 上调用一个特殊的方法,你可以将方法声明更改为 setRootTableViewController:(CustomTableViewController *)controller (或任何你的自定义表 Controller 被调用),并替换 reloadData与调用该方法的方法一致。

然后,在您的应用委托(delegate)中,而不是创建 UINavigationController并添加您的自定义 View Controller ,创建其中一个,然后调用此方法添加第一个 View 。

但是,如果您使用 Nib 来设置 rootViewController , 你可以覆盖 initWithRootViewController:(UIViewController *)controller ,正如我想象的那样,nib 将调用它来设置堆栈中的第一个 View :

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

希望这对您有所帮助!

关于ios - 在 UINavigationController 中首次加载 View Controller 的事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7421703/

相关文章:

ios - 使用 Uisearchbar 加载时 Uiview 崩溃

ios - 导航栏不出现

iphone - 导航栏 "back"关闭模态视图的按钮

ios - 交互式默认 UINavigationController 转换

ios - 幽灵 View Controller

ios - 如何在透明 UINavigationBar 和带背景颜色的 UINavigationBar 之间切换

ios - 如果用户触摸 UIImageView 则退出键盘

ios - React Native Navigator 转换问题

ios - UIButton 没有在 ios7 上注册

ios - clang : error: linker command failed with exit code 1 (use -v to see invocation) with Quickblox