修改导航堆栈时未调用viewDidLoad

时间:2014-11-12 15:35:18

标签: ios objective-c

我将从导航堆栈中删除所有视图,然后创建一个新控制器(来自故事板)并将其添加为堆栈中的唯一控制器。问题是在实例化新控制器时,从不调用viewDidLoad(使用断点检查)。任何想法为什么会这样?代码如下。

[self.collectionView.collectionViewLayout invalidateLayout];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
PFGridPageViewController *nc = [storyboard instantiateViewControllerWithIdentifier:@"GridPageVC"];
[self.navigationController setViewControllers:nil];
NSArray *new = [[NSArray alloc] initWithObjects:nc, nil];
[self.navigationController setViewControllers:new];

临时解决方案

正如您在Ian对已接受答案的讨论中所看到的,修改导航堆栈是一个坏主意。我在做一些更好的工作时想出了一个临时解决方案。基本上我使用popToRoot和pushVC然后修改堆栈一次以删除索引0处的VC。

[self.navigationController popToRootViewControllerAnimated:NO];
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
PFGridPageViewController *nc = [storyboard instantiateViewControllerWithIdentifier:@"GridPageVC"];
[self.navigationController pushViewController:nc animated:NO];
NSMutableArray *controllers = [NSMutableArray arrayWithArray:self.navigationController.viewControllers];
[controllers removeObjectAtIndex:0];
[self.navigationController setViewControllers:controllers];

1 个答案:

答案 0 :(得分:1)

仅当您访问viewDidLoad的{​​{1}}属性时,才会调用

.view。这似乎是一种非常规的UIViewController方式。

如果您确定您的实施(我不是),只需在此处添加此行,它就会为您致电[self.navigationController pushViewController:nc animated:NO]

viewDidLoad