gpt4 book ai didi

ios - 弹出后 UINavigationController 为零

转载 作者:行者123 更新时间:2023-11-28 18:22:27 24 4
gpt4 key购买 nike

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

...
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"];
}
...

在这段代码中,如果当前 View 不同于 ClassName,我必须直接进入下一个 View ,否则返回 1 个 View 并转到下一个 View 。

- (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 的父类,在此方法中,导航 Controller 的第一个日志对于所有 View Controller 堆栈都是正确的,并且执行了 popViewController 但在第二个日志中,navigationController 为空明明是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];
}

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

编辑 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提示的操作,两个地址相同

最佳答案

根据您上次的编辑,一种解决方案是保留对导航 Controller 的引用。你的 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 相同。试试看,然后告诉我们您的结果!

关于ios - 弹出后 UINavigationController 为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17657085/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com