2016-12-03 72 views
1

我有AVPlayer播放音樂視圖控制器(在ex。B)。問題是,我通過執行segue並傳遞播放列表對象(歌曲列表)從另一個(例如A)VC中打開此View Controller。第一次,一切工作都很好,但是當我再次對一個VC執行segue(而不是一個unwind segue)時,不知何故(我相信)B VC仍然具有舊值並且在內存中(?)。而當我點擊另一個播放列表並對B VC執行segue時,它會開始播放新播放列表中的音樂,並以某種方式從舊播放列表中播放音樂,並且我得到兩個我甚至無法殺死的AVPlayers。如果我重複這一步,AVPlayers的數量會不斷增加。快速殺死視圖控制器時執行segue

所以,問題是(這不是我的代碼,因此沒有必要的):

是否執行SEGUE殺死最後一個VC實例(?)?

如果不是,我應該如何呈現新的VC並將變量傳遞給它?

+2

嗯,爲什麼要進行一個新的賽格?你爲什麼不放鬆? – avismara

+0

同意用戶@avismara,推薦回到'dismis'和'pop'的方法。 – vaibhav

+1

當你從A變成B時,你不會殺了它。仍然留在堆棧中。如果你想從B到A,那麼你應該使用unwind segue進行導航。如果你想通過殺死A從A到B,那麼你應該有一個自定義的容器視圖 – KrishnaCA

回答

2

從來沒有想過這將保證一個單獨的答案;認爲這可以通過評論輕鬆回答。但是,我不能讓這個問題與Amar在這裏提供的答案存在。這是錯誤的,在上下文中根本沒有意義。

這就是說,要回答你的問題,爲什麼這些實例沒有被殺死,因爲,你在做的方式 - 在視圖控制器上執行segges,生成一個如下所示的堆棧:

A - >乙 - > A - >乙 - > A - >乙

如果您還記得堆棧數據結構,這是相同的 「推」 的元素到一個「視圖控制器的堆」。這種設計「要求」視圖控制器的所有實例都保留在內存中。這解釋了爲什麼音樂不會停止。

殺了B?那麼,只需從這個「堆棧」中將「B」的實例「pop」ping掉就可以殺死它。

您有:

一個

您現在正在推動B

甲 - >乙

現在如果你想回去B。你彈出B。現在堆棧看起來像這樣。

一個

B是歷史。注意在前面的情況下如何持續推動,B還活着並唱歌。

在iOS中有幾種從這個棧中彈出視圖控制器的方法。如果您在UINavigationController上構建此API,則有popViewController(:animated:)等API。有dismissViewController(:animated:completion:),如果你是模態展示視圖控制器。當然,還有一些規定的放鬆步驟可以幫助你彈出視圖控制器。

-1

你應該沒有播放器控制器對象零或使視頻控制器的播放器對象周引用。或者你可以檢查是否創建每次新的vc實例

import UIKit 

var instanceCount: Int = 0 // 

class MayBeAClassHere { 
} 

import UIKit 

class ViewController: UIViewController { 

override func viewDidLoad() { 
    var inViewController = instanceCount 
    inViewController++ // inViewController is a brand new COPY 
    println(inViewController) // print 1 
    println(instanceCount) // print 0 
} 
} 
相關問題