2016-04-10 33 views
0

我有一個Bool firstAppear在我的SecondViewController中。播放視頻時,布爾變爲假。然後,如果我回到我的FirstViewController並返回,則視頻將再次播放。據我所知,我總是創建ViewController的另一個實例,這就是爲什麼我的邏輯是錯誤的。我需要做些什麼來實現它?firstAppear將無法正常工作,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) 
    } 

回答

1

如果你想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 { ... } 

這將持續到用戶卸載應用程序。我顛倒了bool的含義的原因是因爲unset bool是錯誤的。這簡化了一些事情(否則你必須使用registerDefaults來使默認值爲true)

請注意,這不是static變量。這並不重要,因爲所有實例共享相同的默認數據庫。

+0

好的,但是,我應該做更多的同一屏幕的實例嗎?這是正確的方法嗎? – PoolHallJunkie

+0

通常你不應該調用'instantiateViewControllerWithIdentifier'。你應該使用Storyboard segue。但是這也會創建多個實例。如果視圖控制器當前不在屏幕上,它們永遠不應該存在。 (有關segues,請參閱https://developer.apple.com/library/ios/recipes/xcode_help-IB_storyboard/Chapters/StoryboardSegue.html。) –