Как инициализировать переменную при инициализации IBOutlet? - PullRequest
0 голосов
/ 16 декабря 2018

Мне удалось написать следующий фрагмент кода в одном из моих UIViewControllers в моем новом приложении iOS Swift.

var starButtonsCount = starButtons.count
@IBOutlet var starButtons: [UIButton]!

Затем, прямо рядом с объявлением переменной starButtonsCount, следующая ошибка появилась красным.

Ошибка: невозможно использовать элемент экземпляра starButtons в инициализаторе свойства;инициализаторы свойств запускаются до того, как станет доступным 'self'.

Итак, я обнаружил, что, объявив переменную starButtonCount как lazy, мы можем устранить эту ошибку (временную в долгосрочной перспективе приложения iOS).процесс разработки).

Мне любопытно узнать, какие есть другие способы решения этой проблемы?

Есть ли способ инициировать инициализацию для starButtonCount, когда starButtons IBOutletsполучить инициализацию?

Ответы [ 4 ]

0 голосов
/ 16 декабря 2018

Простое решение - это константа

let starButtonsCount = 8 // or whatever the number of buttons is

IBOutlets подключены во время сборки, поэтому количество кнопок не изменится во время выполнения.

Вы можете добавить строку подтверждения вviewDidLoad для получения информации об изменении количества кнопок в будущей версии приложения

assert(starButtons.count == starButtonsCount, "number of buttons has changed, adjust starButtonsCount") 
0 голосов
/ 16 декабря 2018

awakeFromNib - это метод, вызываемый, когда каждый объект в .xib был десериализован и граф всех подключенных выходов.Документация гласит:

Декларация

func awakeFromNib()

Обсуждение

сообщение каждомуобъект воссоздается из архива пера, но только после загрузки и инициализации всех объектов в архиве.Когда объект получает сообщение awakeFromNib, он гарантирует, что все его подключения к выходам и действиям уже установлены. Инфраструктура загрузки nib отправляет awakeFromNib

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

Как в:

class MyUIViewController : UIViewController {
    var starButtonsCount = 0
    @IBOutlet var starButtons: [UIButton]!
    override func awakeFromNib() {
        super.awakeFromNib()
        starButtonsCount = startButtons.count
    }
}
0 голосов
/ 16 декабря 2018

Также обратите внимание, что starButtonsCount не является хранимой переменной:

var starButtonsCount: Int {
   return starButtons.count
}

В этом случае, вероятно, было бы лучше использовать starButtons.count напрямую, так как переменная не улучшает кодни в коем случае.

В общем случае нет необходимости сохранять производное состояние, если только его сохранение не обеспечивает некоторого повышения производительности (например, вычисление кэширования).

0 голосов
/ 16 декабря 2018

Другой способ

var starButtonsCount:Int! 
@IBOutlet var starButtons: [UIButton]! { 
    didSet { 
         starButtonsCount = starButtons.count
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...