Swift、Modal Segue 和 ViewController 问题

Posted

技术标签:

【中文标题】Swift、Modal Segue 和 ViewController 问题【英文标题】:Swift, Modal Segue and ViewController Issue 【发布时间】:2016-04-07 20:06:00 【问题描述】:

我有两个 ViewController,StartVC 和 MainVC。当应用程序启动时,我使用 Modal Segue 从 StartVC 移动到 MainVC。

self.performSegueWithIdentifier("StartToMain", sender: self)

MainVC 然后显示一个地图,加载用户位置并将其显示在地图上并放大它并在其上创建一些注释并显示 AdMob 横幅。一切正常。

然后,当用户点击后退按钮时,segue 会被关闭:

self.presentingViewController?.dismissViewControllerAnimated(true, completion: nil)

现在当用户点击一个按钮并且再次触发模态segue并且用户再次进入MainVC时,地图仍然显示用户位置但不放大,不加载任何注释,不设置区域并且admob横幅是未加载。

我对此感到困惑。我已经检查过 MainVC 的 ViewDidLoad 和 ViewDidAppear 是否也在第二次触发,代码执行甚至达到了应该放大地图等的功能,但它没有生效。有谁知道,这可能是什么原因造成的?

我还应该提到,当用户第二次访问 MainVC 时,AdMob 尝试显示插页式广告时会抛出以下错误:

警告:尝试呈现 上的 0x139b07e20>,其视图不在 窗口层次结构!

此外,目前,执行所有缺失功能的函数调用位于 locationManager didUpdateLocations 方法中。例如,如果我将它移到viewDidAppear,它就可以工作。

【问题讨论】:

您是否使用导航控制器来执行此操作?或者它只是一个视图控制器和另一个?你是模态展示还是使用推送? 我没有使用导航,而是以模态方式呈现,因为我喜欢水平翻转效果。 Hrm... 您可以尝试嵌入 Nav 控制器,以查看事情是否表现得更合适。我的猜测是这与对 presentingViewController 的引用有关,这对我来说充其量是不可靠的。 【参考方案1】:

您可以尝试一些事情。

首先:确保您在 viewDidAppear 方法中进行所有导航。您不应该在 ViewDidLoad 或 ViewWillAppear 方法中调用另一个 VC。

第二:您可以使用展开转场导航回到 StartVC。在情节提要上创建展开转场,然后像这样以编程方式调用它:

self.performSegueWithIdentifier("UnwindSegue", sender: self)

You can find more info about unwind segues here

希望对你有帮助。

【讨论】:

以上是关于Swift、Modal Segue 和 ViewController 问题的主要内容,如果未能解决你的问题,请参考以下文章

Swift Modal Self 变为 Nil

Storyboard 中的 Modal 和 Push segue 有啥区别?

swift学习笔记页面转跳的条件判断和传值

Page curl modal segue:将底部栏留在屏幕上

使用 Modal Segue 保留复选标记

从 Modal/Popover 展开 Segue 导致开始/结束外观转换的调用不平衡