【发布时间】:2013-07-15 14:46:00
【问题描述】:
我的项目很复杂(可能有点太多了)但问题很简单,这里是代码
...
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 不同,我必须直接进入下一个视图,否则返回前一个视图并转到下一个。
- (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 控制器的第一个日志对所有视图控制器堆栈都是正确的,popViewController 被执行但在第二个日志中,navigatin 控制器显然是 0 元素的 null,并且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提示的操作,两个地址是一样的
【问题讨论】:
-
可能在 popViewController 之后,您对 navigationController 的引用为零。在第二条日志中打断点,在控制台打“po self.navigationController”查看输出,贴在这里!
标签: ios pushviewcontroller navigationcontroller