我的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/

10-13 03:54