按下后退按钮后,navigationController 为 NULL

Posted

技术标签:

【中文标题】按下后退按钮后,navigationController 为 NULL【英文标题】:navigationController is NULL after pressing the back button 【发布时间】:2012-10-07 18:26:32 【问题描述】:

我有一个应用程序,它具有从情节提要构建的导航控制器。每个视图控制器都有一个表,每次用户从下一个视图返回时都需要刷新,所以假设用户像视图控制器 A->B->C 一样,那么当他返回 B 时我需要刷新视图 B 中表格上的值。

我正在尝试使用 UINavigationControllerDelegate 执行此操作,因此每次用户在导航中来回移动时都会调用 didShowViewController:

- (void) navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated

    // Do some initialization stuff
    // and then get entries from an external database

   [self fetchEntries];

   // Log:
   NSLog(@"View-B: \nself=%@ \nnavigationController=%@\nDelegate:%@\nviewControllers:%@", self, self.navigationController, self.navigationController.delegate, self.navigationController.viewControllers);

我在 viewDidLoad 上设置了委托:

- (void)viewDidLoad 

    [super viewDidLoad];

    // Sets the delegate for Navigation Controller
   [self.navigationController setDelegate:self];   

问题是,由于某种原因,navigationController 在某处被设置为 NULL,我找不到它在哪里,因为我没有做任何显式的推送/弹出操作(正如我提到的,导航控制器是在 Storyboard 中构建的)。

确切的顺序是:A->B->C->B,这里的 navigationController 为 NULL。以下是一些 NSLog 输出:

1) 当用户从 A->B 出发时

2012-10-07 14:50:28.170 MyApp[35765:207] View-B: 
self=<View-B: 0x6a660b0> 
navigationController=<UINavigationController: 0x6823b20>
Delegate:<View-B: 0x6a660b0>
viewControllers:(
    "<View-A: 0x6879e90>",
    "<View-B: 0x6a660b0>"
)

2) B->C

2012-10-07 14:50:31.371 MyApp[35765:207] View-C: 
self=<View-C: 0x6a69a10> 
navigationController=<UINavigationController: 0x6823b20>
Delegate:<View-C: 0x6a69a10>
viewControllers:(
    "<View-A: 0x6879e90>",
    "<View-B: 0x6a660b0>",
    "<View-C: 0x6a69a10>"
)

3) 然后是 C->B

2012-10-07 14:50:37.027 MyApp[35765:207] View-C: 
self=<View-C: 0x6a69a10> 
navigationController=(null)
Delegate:(null)
viewControllers:(null)

我真的不明白为什么 navigationController 会在这里变为 NULL。我发现问题发生在我在 viewDidLoad 中设置委托时。如果我删除该行并将代码从协议过程(didShowViewController)移动到 viewDidLoad 一切正常,除了当用户返回导航堆栈时我无法刷新我的表。

同样奇怪的是,在第 (3) 步中,didShowViewController 是从 View-C 而不是从 View-B 调用的。

非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

我相信你应该调用 [self.tableview reloadData];在 viewController B 的 viewWillAppear 处。

【讨论】:

是的,这实际上解决了问题。 viewDidLoad 仅在第一次加载视图时调用,而 viewWillAppear 在第一次加载和用户返回导航堆栈时都会调用,所以我不需要担心从导航控制器到其委托的消息.仍然我不明白为什么导航控制器得到一个 NULL 值,但我暂时不会担心......感谢您的回复!

以上是关于按下后退按钮后,navigationController 为 NULL的主要内容,如果未能解决你的问题,请参考以下文章

iOS 禁用 NavigationController 后退按钮的动画

在后退按钮点击完成编辑 UITextField

按下后退按钮后,从另一个视图控制器更改按钮

添加NavigationController不会显示后退按钮

在android中按下后退按钮后如何返回相同的选项卡?

iOS 5中缺少navigationController栏后退按钮