我无法理解为什么我的 viewController 会被第二次分配。 总体思路是这样的:
1) 我在这个 viewController 中有第一个 viewController(称为 loginScreenViewController),用户从 FB/T/Mail 选择登录
2)一旦用户选择了邮件选项,我就会推送下一个名为 mailRegistrationViewController 的 viewController
3) 一旦用户使用此 viewController 登录/注册,我就会转到下一个名为 homeViewController 的 viewController 并弹出导航堆栈的 mailRegistrationViewController
流行
NSMutableArray *navStack = [NSMutableArray arrayWithArray:self.navigationController.viewControllers];
[navStack removeObjectIdenticalTo:self];
[self.navigationController setViewControllers:navStack];
删除 mailRegistration 后的导航堆栈:
"<SELoginScreenViewController: 0x8f46030>", "<SEHomeViewController: 0x8e62dc0>"
4) 在 homeViewController 中,一旦用户注销,我将他注销并弹出 homeViewController,这次使用
[self.navigationController popViewControllerAnimated:YES]; // remove from the navigation stack
我再次打印删除前后的导航堆栈
之前:
"<SELoginScreenViewController: 0x8f46030>", "<SEHomeViewController: 0x8e62dc0>"
之后:
"<SELoginScreenViewController: 0x8f46030>"
然后在 loginViewController 的 viewWillAppear 中记录导航堆栈,这就是我得到的:
"<SELoginScreenViewController: 0x8f46030>", "<SELoginScreenViewController: 0x8f6ea70>"
我的登录 View 再次分配和初始化。 如果有人知道为什么会这样,或者如果我需要添加更多代码,请告诉我。
谢谢
最佳答案
理想情况下,您应该只使用 pushViewController:animated
和 popViewController:animated
来更改 UINavigationController 的 viewController 堆栈。
像这样执行第 3 步:
do
{
id *poppedVC = [self.navigationController popViewControllerAnimated:NO];
// animation not required since you will soon push a new view controller with animated:YES
} while(poppedVC != self);
[self.navigationController pushViewController:homeViewController animated:YES];
基本上,这会改变您从 viewController 堆栈中删除 mailRegistrationViewController 的顺序。
关于ios - ViewController 不需要的分配和初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24034182/