2016-04-10 8 views
0

Benim SecondViewController içinde bir Boole firstAppear var. Bir video oynatıldığında Bool yanlış olur. Daha sonra FirstViewController'a geri dönüp geri dönersem, video tekrar oynatılır. Anladığım kadarıyla, her zaman ViewController'ın başka bir örneğini yaratıyorum, bu yüzden mantığımın neden yanlış olduğunu. Bunu başarmak için yapmam gereken değişiklikler nelerdir? firstAppear işe yaramıyor, ViewController init her zaman

@IBAction func nextButtonPressed(sender: AnyObject) { 
     if let secondViewController = storyboard?.instantiateViewControllerWithIdentifier("answer") as? SecondViewController{  
      SecondViewController.id = self.id 
     } 
     self.navigationController?.pushViewController(secondViewController, animated: true) 
} 

Ve İkinci içinde

:

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) 
    } 

cevap

1

Eğer firstAppear bu sınıfın tüm örnekleri tarafından paylaşılabilir istiyorsanız, o zaman bunu static yapmak gerekir:

private static var firstAppear = true 

... 
    if SecondViewController.firstAppear { 
... 
      SecondViewController.firstAppear = false 

Statik değişkenler türle ilişkili, belirli bir örnek değil.

Statik değişkenlerin hala bellek içi değişkenler olduğunu unutmayın. Programın infazları arasında ısrar etmiyorlar. Bu, muhtemelen karışıklığa yol açacak ve playVideo()'un rasgele bir şekilde uygulanmasına neden olacaktır (program başlatma başına bir kez, ancak "program başlatma", kullanıcının gerçek bir görünüme sahip olmadığı bir şey değildir).

Çoğu durumda, tam olarak burada kastettiğiniz, kalıcı bir değişken depolamaktı ve bu genellikle NSUserDefaults ile yapılır. Bunun gibi bir şey: kullanıcı uygulamayı kaldırana kadar bu devam edecektir. Bool'un anlamını tersine çevirmenin sebebi, unset boole'un yanlış olması. Bu, bazı şeyleri basitleştirir (aksi halde registerDefaults'u varsayılan yerine true yapmak zorunda kalırsınız.)

Bunun bir static değişkeni olmadığını unutmayın. Tüm örneklerin aynı varsayılan veritabanını paylaşması nedeniyle, bir şekilde veya diğerinden önemli değildir.

+0

Tamam, ama aynı ekrandan daha fazla örnek yapmalı mıyım? Bu gitmek için doğru yol mu? – PoolHallJunkie

+0

Genel olarak, 'instantiateViewControllerWithIdentifier' öğesini çağırmamanız gerekir. Storyboard segue kullanmalısınız. Ama bu da çok sayıda örnek oluşturacak. Görünüm denetleyicileri, şu anda ekranda görünmüyorsa, hiçbir zaman varolmaması gerekir. (Segues için bkz. Https://developer.apple.com/library/ios/recipes/xcode_help-IB_storyboard/Chapters/StoryboardSegue.html.) –