Swift - 初始化UIViewController

Lak*_*Le_ 5 ios swift

我在UIViewController中遇到初始化参数的问题.我上课了:

class ViewController: UIViewController {
   @IBOutlet var cardButtons: Array<UIButton>

   var flipCount = 0
   var game: CardMatchingGame
   var backCardImage: UIImage
   var frontCardImage: UIImage

   required init(coder aDecoder: NSCoder) {
      self.backCardImage = UIImage(named: "back")
      self.frontCardImage = UIImage(named: "front")
      self.game = CardMatchingGame(count: cardButtons.count, deck: createDeck())

      super.init(coder: aDecoder)
  }

  @IBAction func touchCardButton(sender: UIButton) {
      var cardButtonsArray = cardButtons as NSArray
      var chosenButtonIndex = cardButtonsArray.indexOfObject(sender)
      game.chooseCardAtIndex(chosenButtonIndex)
  }

  func createDeck() -> Deck {
      return PlayingCardDeck()
  }
Run Code Online (Sandbox Code Playgroud)

}

但我有一个错误

count: cardButtons.count >> Variable 'self.cardButtons' used before being initialized/Property 'self.cardButtons' not initialized at super.init call
Run Code Online (Sandbox Code Playgroud)

deck: createDeck() >> 'self' used before super.init call
Run Code Online (Sandbox Code Playgroud)

如何修复此问题才能正确初始化UIViewController?

谢谢您的帮助.

Mik*_*ard 3

您想要覆盖awakeFromNib并访问那里的插座,而不是在初始化程序中。

“nib 加载基础设施会向从 nib 存档重新创建的每个对象发送一条 awakeFromNib 消息,但前提是存档中的所有对象都已加载并初始化。当一个对象收到 awakeFromNib 消息时,它保证拥有其所有出口和已经建立的行动联系。”

所以我建议类似:

class ViewController: UIViewController {
   @IBOutlet var cardButtons: Array<UIButton>!

   var flipCount = 0
   var game: CardMatchingGame!
   var backCardImage: UIImage
   var frontCardImage: UIImage

   required init(coder aDecoder: NSCoder) {
      self.backCardImage = UIImage(named: "back")
      self.frontCardImage = UIImage(named: "front")

      super.init(coder: aDecoder)
  }

  override func awakeFromNib() {
      super.awakeFromNib()
      self.game = CardMatchingGame(count: cardButtons.count, deck: createDeck())
  }

  @IBAction func touchCardButton(sender: UIButton) {
      var cardButtonsArray = cardButtons as NSArray
      var chosenButtonIndex = cardButtonsArray.indexOfObject(sender)
      game.chooseCardAtIndex(chosenButtonIndex)
  }

  func createDeck() -> Deck {
      return PlayingCardDeck()
  }
}
Run Code Online (Sandbox Code Playgroud)