按下后退按钮后,navigationController为NULL

时间:2012-10-07 18:26:33

标签: ios uinavigationcontroller

我有一个应用程序,它具有从故事板构建的导航控制器。每个视图控制器都有一个表,每次用户从下一个视图返回时都需要刷新,所以让我们说如果用户像视图控制器A-> B-> C那样,那么当他回到BI需要时刷新视图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];   
}

问题在于,由于某些原因导航控制器在某处被设置为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)中,从View-C调用didShowViewController而不是从View-B调用。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

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