流行后UINavigationController为零

时间:2013-07-15 14:46:00

标签: ios pushviewcontroller navigationcontroller

我的项目很复杂(可能有点太多)但问题很简单,这是代码

...
self.vc = [[ClassName alloc] init];
if ([[self.navigationController.viewControllers lastObject] isKindOfClass:[ClassName class]]) {
    [self backAndGo:self.vc title:@"Title"];
}
else {
    [self vai:self.vc title:@"title"];
}
...

在此代码中,如果当前视图与ClassName不同,我将直接进入下一个视图,否则返回1视图,然后转到下一个视图。

- (void)backAndGo:(id)查看标题:(NSString *)title

- (void)backAndGo:(id)view title:(NSString *)title
{
    NSLog(@"before %@,%d",[self.navigationController viewControllers],[[self.navigationController viewControllers] count]);

    [self.navigationController popViewControllerAnimated:NO];

    ALCParentViewController *viewController = (ALCParentViewController *)view;
    [self.navigationController pushViewController:viewController animated:YES];

    NSLog(@"after %@,%d",[self.navigationController viewControllers],[[self.navigationController viewControllers] count]);
}

ALCParentViewController是父类的VC的,在该方法navigatin控制器的第一日志是正确与viewcontrollers的所有堆叠,并且执行popViewController,但在所述第二日志navigationController是null与0元件明显,pushViewController方法没有执行,为什么?任何想法?

- (void)vai:(id)查看标题:(NSString *)title

- (void)vai:(id)view title:(NSString *)title
{       
    ALCParentViewController *viewController = (ALCParentViewController *)view;
    [self.navigationController pushViewController:viewController animated:YES];
}

这是直接到达第二个视图的另一种方法,并且它正常工作,另一个courius事情(几乎对我而言)是在其他视图中正常运行nil pushviewcontroller,导航(推送和弹出)...

编辑1:

正如lucaslt89所说我在第二个日志中放了一个断点并在consolle中创建“po self.navigationController”,这里的结果是

(lldb) po self.navigationController
$0 = 0x00000000 <nil>
(lldb)

它没有,但我可以在没有断点的日志中看到......

编辑2:

(lldb) po self.navigationController
$0 = 0x099787d0 <UINavigationController: 0x99787d0>
(lldb) po auxNavController
$1 = 0x099787d0 <UINavigationController: 0x99787d0>
(lldb)

在lucaslt89建议的操作之后,两个地址是相同的

3 个答案:

答案 0 :(得分:4)

根据您的上一次编辑,一种解决方案是保存对导航控制器的引用。您的 backAndGo 方法应该是那样的

- (void)backAndGo:(id)view title:(NSString *)title
{
    NSLog(@"before %@,%d",[self.navigationController viewControllers],[[self.navigationController viewControllers] count]);

    UINavigationController *auxNavController = self.navigationController;

    [self.navigationController popViewControllerAnimated:NO];

    ALCParentViewController *viewController = (ALCParentViewController *)view;
    [auxNavController pushViewController:viewController animated:YES];

    NSLog(@"after %@,%d",[auxNavController viewControllers],[[auxNavController viewControllers] count]);
}

如果你调试那个,pop之前的self.navigationController的地址应该与pop之后的auxNavController相同。试试并告诉我们你的结果!

答案 1 :(得分:2)

好的,即使问题已经结束,我也想为将来的访客做出解释。根据{{​​3}}:...如果视图控制器未嵌入导航控制器中,则此属性为nil。

这正是你用pop指令做的。因此,基本上,在因为pop而失去对导航控制器的引用之前,请确保存储对它的引用。

答案 2 :(得分:0)

backAndGo 方法中: 首先弹出一个viewController,然后再推送另一个ViewController。

问题是,在弹出viewController之后,“self”为零。因此,如果您使用“self.navigationController”获取navigationController,它将不返回任何内容。

原因是因为“self”是nil,而不是navigationController是空的。这就是为什么lucastl89的答案是有效的。他通过引用持有一个navigationController对象,而不是使用“self”来搜索它。