Ios 执行segue时的Swift kill视图控制器
我有视图控制器(在ex.B中)和AVPlayer,用于播放音乐。问题是,我通过执行segue并传递playlist对象(歌曲列表),从另一个(例如A)VC打开这个视图控制器。第一次一切都很好,但当我再次对VC执行segue(而不是放松segue)时,不知何故(我相信)VC仍然保留着旧的值,并且在内存中(?)。当我点击另一个播放列表并执行segue to B VC时,它开始播放新播放列表中的音乐,不知何故,音乐开始播放旧播放列表中的音乐,我得到了两个我甚至无法杀死的AVPlayer。如果我重复这一步,AVP玩家的数量会不断增加 所以,问题是(这与我的代码无关,所以不需要): 执行segue是否会杀死最后一个VC实例(?)Ios 执行segue时的Swift kill视图控制器,ios,swift,segue,Ios,Swift,Segue,我有视图控制器(在ex.B中)和AVPlayer,用于播放音乐。问题是,我通过执行segue并传递playlist对象(歌曲列表),从另一个(例如A)VC打开这个视图控制器。第一次一切都很好,但当我再次对VC执行segue(而不是放松segue)时,不知何故(我相信)VC仍然保留着旧的值,并且在内存中(?)。当我点击另一个播放列表并执行segue to B VC时,它开始播放新播放列表中的音乐,不知何故,音乐开始播放旧播放列表中的音乐,我得到了两个我甚至无法杀死的AVPlayer。如果我重复这一
如果没有,我应该如何呈现新的VC并将变量传递给它?您应该将玩家控制器对象设置为nil或使用视图控制器将玩家对象设置为week引用。也可以检查每次创建的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
}
}
从来没有想过这需要一个单独的答案;我认为这很容易在评论中得到回答。但我不能让这个问题在阿马尔提供答案的情况下存在。这是错误的,在上下文中毫无意义 也就是说,为了回答您的问题,实例没有被杀死的原因是因为,您所做的方式——在视图控制器上执行分段,构建了一个如下所示的堆栈: A->B->A->B->A->B 如果您还记得堆栈数据结构,这与将元素“推”到“视图控制器堆栈”上是一样的。此设计“要求”视图控制器的所有实例都保留在内存中。这就解释了为什么音乐不会停止 什么杀死了
B
?那么,简单地说,从这个“堆栈”中“弹出”pingB
的实例,就可以杀死它
你有:
A
您现在正在按B
:
A->B
现在,如果您想返回到B
。你弹出B
。现在堆栈看起来像这样
A
B
是历史记录。请注意,在上一个连续按压的情况下,B
是如何活动和歌唱的
在iOS中,有几种方法可以从这个堆栈中弹出视图控制器。如果您是在
UINavigationController
上构建此应用程序,则存在类似于popViewController(:animated:)
的API。如果您以模式显示视图控制器,则会有dismissViewController(:animated:completion:)
。当然,也有一些规定的展开段可以帮助您弹出视图控制器 嗯,为什么要表演一段新的音乐?为什么不放松一下呢?同意用户@avismara,这是返回dismis
和pop
的推荐方式。当你从A切换到B时,你不会杀死它。一个仍然留在堆栈中。如果你想从B转到A,你应该使用“放松”序列导航回来。如果你想通过杀死A来从A到B,那么你应该有一个定制的容器视图来实现这一点