2

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

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

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

警告!在演示过程中尝试在 <LoginVC: 0x756fcf0> 上演示 <MainNavigationVC: 0x753110>!

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

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

  • 从 UserStartpageVC 中运行

    [x dismissViewControllerAnimated:YES 完成:NULL]

    [xdismissModalViewControllerAnimated:YES]

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

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

    [self.loginVCdismissViewControllerAnimated:YES 完成:NULL]

等等。

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

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

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

4

2 回答 2

3

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

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

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

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

于 2012-09-26T18:11:36.170 回答
0

呼啦啦!我的错。

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

同时做多个segues,是......好吧,显然很糟糕。

于 2012-09-26T10:17:54.783 回答