2017-04-06 80 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