Swift - initialize UIViewController

I have a problem initializing my parameters in a UIViewController. I have a class:

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

}

but I have a mistake in

count: cardButtons.count >> Variable 'self.cardButtons' used before being initialized/Property 'self.cardButtons' not initialized at super.init call

and

deck: createDeck() >> 'self' used before super.init call

How can I fix this to get a correctly initialized UIViewController?

Thank you for your help.

+4
source share
3 answers

You want to override awakeFromNiband access the outlet there, and not in the initializer.

" nib-load awakeFromNib , nib, , . 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()
  }
}
+3

, , . viewDidLoad() , . , , , .

, :

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

viewDidLoad() - Apple Developer: viewDidLoad

0

As indicated here, all variables must be initialized before the call super.init.

Since @IBOutletInterface Builder is initialized, the exclamation point must be exact:

@IBOutlet var cardButtons: Array!

You may also need to add strong: fooobar.com/questions/122387 / ...

-1
source

All Articles