模态 UINavigationController 隐藏但不关闭

Posted

技术标签:

【中文标题】模态 UINavigationController 隐藏但不关闭【英文标题】:Modal UINavigationController hides although not dismisses 【发布时间】:2012-09-26 07:43:25 【问题描述】:

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

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

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

警告!尝试呈现 正在进行演示!

我想这意味着登录视图正在尝试以模态方式显示 MainNavigationVC 导航控制器,但已经显示了另一个,对吧?但是怎么做?可以不显示就呈现视图吗?

注销时如何摆脱旧的导航控制器?我尝试了几种关闭模式视图的方法,例如:

在 UserStartpageVC 中运行

[x dismissViewControllerAnimated:YES 完成:NULL]

[x dismissModalViewControllerAnimated:YES]

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

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

[self.loginVCdismissViewControllerAnimated:YES 完成:NULL]

等等。

所有经过测试的调用实际上都让我回到了登录屏幕,所以它有点工作了。

有什么想法吗?如有必要,可以提供相关的代码示例,我只是无法弄清楚哪些部分是感兴趣的。导航控制器的 seguing 没有代码(performSegueWithIdentifier:sender: 除外),关闭它的代码是我似乎无法理解的部分。

作为旁注。到目前为止,这不是一个真正的问题。该应用程序运行,并且除了 XCode 中的错误消息之外,可以注销并重新登录而不会产生任何其他副作用。但我想如果用户多次注销并登录,这将是内存泄漏,而且我不想被 Apple 不必要地拒绝。

【问题讨论】:

【参考方案1】:

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

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

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

然后你会得到这个错误,因为你可以有效地触发 segue 两次。我认为让按钮调用 IBAction 会关闭我一开始设置的 segue,但显然不是。点击按钮触发了 segue 两次,但是在我删除 segue 并将其重新创建为具有相同标识符的视图上的手动 segue 之后,我能够通过上面的代码调用它并且没有收到警告消息。

【讨论】:

这是一个非常有见地的方法来创建这个错误。我喜欢可可中的错误消息有多大帮助。哦,好吧,至少它不是“err -8046”......【参考方案2】:

呼啦啦!我的错。

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

同时进行多个转场,是……好吧,显然很糟糕。

【讨论】:

以上是关于模态 UINavigationController 隐藏但不关闭的主要内容,如果未能解决你的问题,请参考以下文章

UINavigationController 自定义模态过渡,导航栏太小

模态 UINavigationController - 我无法停止旋转

UINavigationController 按钮在模态呈现之前 layoutIfNeeded 时消失

呈现模态后 UINavigationController 布局损坏

弹出一个以模态方式呈现的 UINavigationController

模态 UINavigationController 隐藏但不关闭