0

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

...
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)view title:(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在第二个日志中,navigatin 控制器是空的,显然是 0 元素,并且该pushViewController方法没有被执行,为什么?有任何想法吗?

- (void)vai:(id)view title:(NSString *)title

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

相反,这是直接到达第二个视图的另一种方法,它可以正常工作,另一件事(几乎对我来说)是尽管 nil pushviewcontroller,其他视图中的导航(推送和弹出)正常工作......

编辑1:

正如 lucaslt89 所说,我在第二个日志中放置了一个断点,并在控制台中创建了“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建议的操作,两个地址是一样的

4

3 回答 3

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]);
}

如果调试的话,弹出前self.navigationController的地址应该和弹出后的auxNavController相同。试试看,告诉我们你的结果!

于 2013-07-15T15:44:50.840 回答
2

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

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

于 2013-07-18T00:38:08.683 回答
0

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

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

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

于 2016-09-04T06:21:07.707 回答