Swift IOS在弹出后保持视图控制器在后台运行

Posted

技术标签:

【中文标题】Swift IOS在弹出后保持视图控制器在后台运行【英文标题】:Swift IOS keep view controller running in background after pop 【发布时间】:2017-04-06 16:34:24 【问题描述】:

我的应用包含两个视图。第一个是GMSMapView,第二个用于连接发送坐标的蓝牙设备。

蓝牙设备连接后,我使用代理将信息发送回地图视图并移动标记。为了在我之前使用 segues 的视图之间进行转换,这并没有停止蓝牙视图控制器,并且数据按照我希望的方式进入地图视图。

我遇到了重新启动地图视图的问题,因此我决定使用导航控制器。现在我使用 push segue 进入我的第二个视图,然后 pop 回到第一个视图的同一个实例。太好了,这有效!我现在遇到的问题是,弹出第二个视图似乎完全阻止它像以前那样在后台运行。有没有办法让它像以前一样在后台运行?

我目前用来弹出第二个视图的是

self.navigationController?.popViewControllerAnimated(true)

任何想法将不胜感激!谢谢!

【问题讨论】:

有没有办法在不破坏视图控制器的情况下进行相同的转换?意思是,有没有办法从第一个视图过渡到第二个视图,然后在保留第一个视图的实例的同时返回? 是的,我已经给出了一个答案,告诉你它是什么 - 但我也警告你这是一个坏主意,并表明你的应用架构可能是错误的。 另外,看起来您使用的是 Swift 2.x。那个版本的 Swift 现在正式死了。您需要更新。 感谢您的意见。 Swift 版本与您正在运行的 xCode 版本相关吗?目前有一台非常旧的 MacBook Air(我工作场所唯一的一台),所以我得看看它是否能跳起来 Xcode 8.3 只能在 Sierra 下运行,唉。但 Xcode 8.2 将允许您更新到 Swift 3,并将在 El Capitan 上运行。对您的代码的冲击——Swift 2 和 Swift 3 之间的差异——将是非常戏剧性和深远的,所以你越早进行这种转换越好。 【参考方案1】:

弹出的视图控制器不会“停止运行”。它会归还给你,如果你不保留它,它会被彻底销毁

如果您不希望发生这种情况,请在退回时保留它。您当前正在忽略返回的视图控制器:

 self.navigationController?.popViewControllerAnimated(true)

相反,保留对它的引用:

self.mySecondViewController = 
    self.navigationController?.popViewControllerAnimated(true)

但是请注意,这是一个非常不寻常的架构。您将无法使用故事板 segue 再次推送,因为它将推送不同的副本。完全放弃导航控制器架构会更好,因为它完全不适合视图控制器在弹出后仍然存在的想法。如果您想要一个同时存在两个视图控制器的架构,您最好使用 UITabBarController — 或者,更好的是,完全重新组织您的应用程序。您需要视图控制器在弹出后仍然存在的想法是一种“不好的气味”:这意味着您将功能放置在错误的位置。将功能放在确实持久的地方,而不是强制视图控制器以某种人为的方式持久。

【讨论】:

感谢马特的回答,我对 ios 完全陌生,所以这正是我正在寻找的答案。我将尝试寻找另一种方法来使我的两种观点保持不变。也许我可以将我的蓝牙功能移回我的主视图控制器,这样我就不需要同时运行第二个视图控制器。 “也许我可以将蓝牙功能移回我的主视图控制器,这样我就不需要同时运行第二个视图控制器”好主意!这正是我鼓励你尝试做的事情。 我之前尝试过这样做,但没有成功。使用 UITabBarController 看起来很容易开始工作,但它可能没有以正确的方式使用它。不过,在转到 UITabBarController 之前,我会付出更多的努力。谢谢!

以上是关于Swift IOS在弹出后保持视图控制器在后台运行的主要内容,如果未能解决你的问题,请参考以下文章

弹出后我可以在 Windows 中运行 ios 应用程序吗?

如何在弹出到根视图 Swift 后立即更改选项卡?

在后台点击 Swift 时禁用关闭弹出框

iOS Swift:Material Snackbar 显示在子弹出视图后面

在弹出它转换到的视图控制器之前,如何使单元格保持突出显示?

iOS 在弹出窗口中显示视图控制器