【发布时间】:2014-11-12 15:35:17
【问题描述】:
我正在从导航堆栈中删除所有视图,然后创建一个新控制器(从情节提要)并将其添加为堆栈中的唯一控制器。问题是 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];
【问题讨论】:
-
代码中的问题是将 viewControllers 设置为 nil。没有必要这样做。如果您只是将一个新数组分配给导航控制器的 viewControllers 属性,它就可以正常工作。我认为您甚至不应该看到您的新视图控制器(是吗?),因为当您将 viewControllers 设置为 nil 时,self.navigationController 将变为 null。
-
@rdelmar 我不知道,谢谢。
-
您也可以使用 setViewControllers:animated: 让它看起来像您将 nc 推入堆栈,即使您重置了数组。
-
通过重置 viewControllers 数组来修改堆栈没有任何问题,只要您正确执行即可(查看 Apple 在方法的引用中所说的 setViewControllers:animated:)。这不是一个坏主意。
标签: ios objective-c