我的项目很复杂(可能有点太多)但问题很简单,这是代码
...
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建议的操作,两个地址是一样的