Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios ViewController不需要的分配和初始化_Ios_Objective C_Uiviewcontroller_Uinavigationcontroller - Fatal编程技术网

Ios ViewController不需要的分配和初始化

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

我很难理解为什么我的viewController第二次被分配。 总体思路如下:

1) 我在这个viewController中有第一个viewController(称为loginScreenViewController),用户从FB/T/Mail选择登录

2) 一旦用户选择了邮件选项,我就会按下下一个名为mailRegistrationViewController的viewController

3) 一旦用户使用此viewController登录/reg,我将转到下一个名为homeViewController的viewController,并弹出导航堆栈的mailRegistrationViewController

流行音乐

删除邮件注册后的导航堆栈:

我再次在删除之前和之后打印导航堆栈

之前:

“”,
""
之后:

“”
然后在视图中的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];