Ios ViewController不需要的分配和初始化
我很难理解为什么我的viewController第二次被分配。 总体思路如下: 1) 我在这个viewController中有第一个viewController(称为loginScreenViewController),用户从FB/T/Mail选择登录 2) 一旦用户选择了邮件选项,我就会按下下一个名为mailRegistrationViewController的viewController 3) 一旦用户使用此viewController登录/reg,我将转到下一个名为homeViewController的viewController,并弹出导航堆栈的mailRegistrationViewController 流行音乐 删除邮件注册后的导航堆栈: 我再次在删除之前和之后打印导航堆栈 之前:Ios ViewController不需要的分配和初始化,ios,objective-c,uiviewcontroller,uinavigationcontroller,Ios,Objective C,Uiviewcontroller,Uinavigationcontroller,我很难理解为什么我的viewController第二次被分配。 总体思路如下: 1) 我在这个viewController中有第一个viewController(称为loginScreenViewController),用户从FB/T/Mail选择登录 2) 一旦用户选择了邮件选项,我就会按下下一个名为mailRegistrationViewController的viewController 3) 一旦用户使用此viewController登录/reg,我将转到下一个名为homeViewCont
“”,
""
之后:
“”
然后在视图中的loginViewController中,我将记录导航堆栈,这是我得到的:
“”,
""
我的登录视图将被再次分配和初始化。
如果有任何关于为什么会发生这种情况的想法,或者如果我需要添加更多代码,请让我知道
感谢理想情况下,您应该只使用
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的顺序。一般来说,人为更改UINavigationController的viewController堆栈不是一个好主意。您应该专门使用
popViewController:animated
和pushViewController:animated
方法来更改VC堆栈。为什么不在SeloginsScreenViewController
的初始值设定器中设置一个断点,并找出第二个实例是何时创建的…@vinodvishwanth您能详细说明一下什么时候创建的吗我应该用它吗?你有没有更好的方法将viewController从堆栈中删除?@MikePallard如果我在init中设置断点,我只知道该方法正在被调用,而不是它被调用的原因。谢谢你应该看到一个堆栈跟踪,它会指出它们为什么工作!谢谢我想我对导航控制器做了一个很糟糕的改动,不用客气。您也可以通过调用[self.navigationController popViewControllerAnimated:NO]在两行代码中完成此操作
然后[self.navigationController pushViewController:homeViewController动画:是]代码>,如果您确定mailRegistrationViewController始终是堆栈的顶部视图控制器。
"<SELoginScreenViewController: 0x8f46030>",
"<SEHomeViewController: 0x8e62dc0>"
[self.navigationController popViewControllerAnimated:YES]; // remove from the navigation stack
"<SELoginScreenViewController: 0x8f46030>",
"<SEHomeViewController: 0x8e62dc0>"
"<SELoginScreenViewController: 0x8f46030>"
"<SELoginScreenViewController: 0x8f46030>",
"<SELoginScreenViewController: 0x8f6ea70>"
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];