我的SecondViewController中有一个Bool firstAppear。播放视频时,布尔变为假。然后,如果我返回FirstViewController并返回,则视频将再次播放。据我了解,我总是创建另一个ViewController实例,这就是为什么我的逻辑是错误的。我需要进行哪些更改才能实现此目标?
@IBAction func nextButtonPressed(sender: AnyObject) {
if let secondViewController = storyboard?.instantiateViewControllerWithIdentifier("answer") as? SecondViewController{
SecondViewController.id = self.id
}
self.navigationController?.pushViewController(secondViewController, animated: true)
}
第二:
private var firstAppear = true
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
if firstAppear {
do {
try playVideo()
firstAppear = false
} catch AppError.InvalidResource(let name, let type) {
debugPrint("Could not find resource \(name).\(type)")
} catch {
debugPrint("Generic error")
}
}
}
@IBAction func pop(sender: AnyObject) {
self.navigationController?.popViewControllerAnimated(true)
}
最佳答案
如果希望该类的所有实例共享firstAppear
,则需要将其设置为static
:
private static var firstAppear = true
...
if SecondViewController.firstAppear {
...
SecondViewController.firstAppear = false
静态变量与类型关联,而不与任何特定实例关联。
请记住,静态变量仍然是内存变量。它们不会在程序执行之间持续存在。这可能会导致混乱,并导致
playVideo()
随机执行(每次程序启动一次,但是用户没有真正的视野可以看到“程序启动”)。在大多数情况下,您真正的意思是存储一个持久变量,通常使用
NSUserDefaults
完成。像这样:private let hasAppearedKey = "hasAppeared"
private var hasAppearedKey {
get { return NSUserDefaults().boolForKey(hasAppearedKey) }
set { NSUserDefaults().setBool(newValue, forKey(hasAppearedKey) }
}
...
if !hasAppeared { ... }
这将一直持续到用户卸载应用程序为止。我之所以颠倒布尔的含义,是因为未设置布尔是错误的。这稍微简化了一些事情(否则,您必须使用registerDefaults来使默认值为true。)
请注意,这不是
static
变量。哪种方式都不重要,因为所有实例共享相同的默认数据库。关于ios - firstAppear将不起作用,每次将ViewController初始化,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36531380/