Modal UINavigationController隐藏虽然没有解散

好的,所以我正在构建一个带有初始登录视图的通用iOS应用程序(视图控制器名为LoginVC),只是一个简单的简单UIViewController。 如果登录成功,则应用程序将转向导航控制器(MainNavigationVC)。 我通过XCode的故事板gui创建了这个segue,因此没有编程创建导航控制器。 导航控制器以全屏模式呈现,因此应用程序的其余部分在登录视图的顶部运行,此导航控制器作为所有内容的核心。

导航控制器包含一个视图(具有名为UserStartPageVC的视图控制器),并在其导航栏中有一个注销按钮。 此按钮向UserStartPageVC发送目标操作,目标是解除导航控制器,从而将用户带回登录视图。

到目前为止一切正常。 我可以按预期登录并使用该应用程序。 但! 当我退出然后重新登录XCode告诉我这个:

警告! 在演示文稿正在进行时,尝试在上显示!

我想这意味着登录视图试图以模态方式显示MainNavigationVC导航控制器,但是已经显示了另一个,对吧? 但是怎么样? 可以在没有显示的情况下呈现视图吗

如何在退出时摆脱旧的导航控制器? 我已经尝试了几种解除模态视图的方法,例如:

  • 从UserStartpageVC中运行

    [x dismissViewControllerAnimated:YES completion:NULL]

    [x dismissModalViewControllerAnimated:YES]

其中x是self,self.parentViewController或self.presentingViewController。

  • 将LoginVC设置为UserStartpageVC中的属性并运行

    [self.loginVC dismissViewControllerAnimated:YES completion:NULL]

等等。

所有经过测试的电话实际上都会让我回到登录界面,所以它有点工作。

有任何想法吗? 如有必要,可以提供相关的代码示例,我只是无法弄清楚哪些部分是感兴趣的。 对导航控制器的搜索没有代码(performSegueWithIdentifier:sender :)除外,解雇它的代码是我似乎无法直接得到的部分。

作为旁注。 到目前为止,这不是一个真正的问题; 应用程序运行,并且可以在没有任何其他副作用的情况下注销和重新登录,而不是XCode中的错误消息。 但是我认为如果用户多次登出并登录,这将是一次内存泄漏,而且我没有心情遭到Apple的不必要的拒绝。

我发现了另一种获取完全相同错误消息的方法。 幸运的我!

如果您在某一点创建了一个segue并将其绑定到一个按钮(单击按钮 – >新视图),然后稍后给该segue命名并直接使用它调用它

[self performSegueWithIdentifier:@"identifierName" sender:self]; 

那么你可以得到这个错误,因为你可以有效地触发segue两次。 我认为让按钮调用IBAction会关闭我在第一时间设置的segue,但显然不是。 按下按钮会触发segue两次,但在我删除segue并在视图上使用相同的标识符重新创建它作为手动segue之后我就可以通过上面的代码调用它而不会收到警告消息。

喧闹! 我的错。

似乎我已经以愚蠢的方式设置了通过登录API调用观察的通知。 每次用户触发登录(或重新登录)时,它都会将自己添加为通知的观察者; 结果是每次登录时它都执行了一次segue。

并且同时做多个segue,是……好吧,显然很糟糕。