我的项目很复杂(可能有点太多)但问题很简单,这是代码
...
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建议的操作之后,两个地址是相同的
答案 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”来搜索它。