2017-04-06 65 views
1

我的应用程序由两个视图组成。第一个是GMSMapView,第二个用于连接发送坐标的蓝牙设备。Swift IOS让视图控制器在弹出后在后台运行

连接蓝牙设备后,我使用代理将信息发送回地图视图并移动标记。为了在我以前使用segues的视图之间进行切换,这并没有阻止蓝牙视图控制器,并且数据像我希望在地图视图中那样产生。

我遇到了我的地图视图被重新启动的问题,所以我决定使用导航控制器。现在我使用push segue来查看第二个视图,然后弹出回到第一个视图的同一个实例。很好,工作!我现在的问题是,弹出第二个视图似乎完全阻止它像过去那样在后台运行。有没有办法让它像以前一样在后台运行?

我目前使用弹出第二种观点是什么

self.navigationController?.popViewControllerAnimated(true) 

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

+0

有什么办法可以让视图控制器销毁而不会有相同的转换吗?意思是说,有没有办法从第一个视图转换到第二个视图,然后返回,同时保留第一个视图的实例? – lhbortho

+0

是的,我已经给出了一个答案,告诉你它是什么 - 但我也告诫你,这是一个坏主意,并表明你的应用程序体系结构可能是错误的。 – matt

+0

另外,它看起来像你使用的是Swift 2.x.该版本的Swift现在已经正式死机。你需要更新。 – matt

回答

1

弹出视图控制器不会“停止运行”。它被退回给你,如果你不保留它,它被完全销毁

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

self.navigationController?.popViewControllerAnimated(true) 

相反,保持对它的引用:但是

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

被警告说,这是一个非常独特的建筑。您将无法再使用storyboard继续推送,因为它会推送不同的副本。最好放弃你的导航控制器架构,因为它完全不适合视图控制器在弹出之后持续存在的想法。如果你想要一个两个视图控制器同时存在的体系结构,最好使用UITabBarController - 或者,甚至更好地重新组织你的应用程序完全。您需要视图控制器在弹出后保持的概念是一种“难闻的气味”:这意味着您将功能放在了错误的地方。将功能放在一个确实保留的地方,而不是强制视图控制器以某种人为的方式持续存在。

+0

感谢您的回答马特,我完全是新的iOS,所以这正是我寻找的答案。我会试着寻找另一种方式让我的两个观点持久。也许我可以将我的蓝牙功能移回到我的主视图控制器,所以我不需要同时运行第二个视图控制器。 – lhbortho

+0

“也许我可以将我的蓝牙功能移回到我的主视图控制器,因此我不需要同时运行第二个视图控制器”好主意!这正是我鼓励你尝试做的事情。 – matt

+0

我以前试过这样做,但没有成功。使用UITabBarController看起来很容易,但它可能不会以正确的方式使用它。尽管如此,在转到UITabBarController之前,我会给出正确的方法。谢谢! – lhbortho

相关问题