Как создать подкласс UIViewController и добавить свойства в swift? - PullRequest
0 голосов
/ 17 мая 2018

Я хочу создать новый вид контроллера представления в Swift, который имеет дополнительное свойство, которое должно быть явно инициализировано.Не имеет смысла, чтобы это свойство было нулевым или имело значение по умолчанию, и контроллер будет инициализироваться только программно.Я попытался определить это следующим образом:

class MyController : UIViewController {
  var prop: Int
  init(prop: Int) {
    self.prop = prop
    super.init()
  }

  required init(coder aDecoder: NSCoder?) {
    fatalError("don't serialize this")
  }
}

Я попытался запустить это, но он потерпел крах, потому что super.init() пытается запустить конструктор nib, который не определен, поэтому я попытался добавить это:

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?) {
  super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}

Но теперь компилятор жалуется, что prop не инициализируется.И это мой вопрос: как здесь правильно инициализировать prop? Мне не нужно значение по умолчанию, и все, что я установлю, переопределит правильное значение, которое я установил в другом инициализаторе.

Я вроде как взломал его, установив какое-то значение по умолчанию в nib init, но затем мой первый init сделал это

self.prop = prop
super.init()
self.prop = prop

Но кроме того, что я действительно странный и уродливый, меня это беспокоиттеперь можно инициализировать мой контроллер вида из пера и получить значение по умолчанию, что было бы плохо.

Какой правильный и идиоматический способ сделать это в Swift?

Ответы [ 2 ]

0 голосов
/ 17 мая 2018

В какой-то момент контроллер представления должен быть инициализирован путем вызова init(nibName:bundle:) или init(coder:)

Попробуйте это:

class MyViewController: UIViewController {

    var prop: Int

    init(prop: Int, nibName nibNameOrNil: String? = nil, bundle nibBundleOrNil: Bundle? = nil) {
        self.prop = prop
        super.init(nibName:nibNameOrNil, bundle: nibBundleOrNil)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

}
0 голосов
/ 17 мая 2018

Попробуйте следующее

class MyController: UIViewController {

    var prop: Int

    required init?(coder aDecoder: NSCoder) {
        fatalError()
    }

    init(prop: Int) {
        self.prop = prop
        super.init(nibName: nil, bundle: nil)
    }
}
...