Ваш код всегда был антипаттерном (то есть неправильным). Простой тест покажет проблему с шаблоном. Я буду использовать контроллер представления:
weak var textField: UITextField? = {
let textField = UITextField()
return textField
}()
override func viewDidLoad() {
super.viewDidLoad()
let tf = self.textField
print(tf as Any) // nil
}
Мы запускаем приложение, и консоль печатает nil
. И вы легко можете понять почему. В какой-то момент инициализируется свойство экземпляра textField
, поэтому выполняется закрытие, и возвращается текстовое поле, которое присваивается textField
. Но это ссылка weak
! Это значит: не держись за меня. Таким образом, свойство экземпляра не удерживает текстовое поле; он отбрасывает его, текстовое поле перестает существовать, а ссылка заменяется на nil
.
Простое решение: не делайте этого! Как я уже сказал, это антипаттерн. Либо удалите слово weak
, либо, если вы намерены поддерживать слабую ссылку на текстовое поле, используйте другой шаблон, например:
weak var textField: UITextField?
private func createTextField() -> UITextField {
let textField = UITextField()
self.textField = textField
return textField
}
override func viewDidLoad() {
super.viewDidLoad()
print(tf as Any) // text field
print(self.textField as Any) // text field
// and now put it into the interface immediately
// or it will go out of existence _again!_
}
Лично я делаю не то. Я делаю это:
weak var textField: UITextField?
private func createTextField() -> UITextField {
let textField = UITextField()
return textField
}
override func viewDidLoad() {
super.viewDidLoad()
let tf = self.createTextField()
self.textField = tf
// and now put it into the interface immediately or it will go out of existence
}
В реальной жизни этот код будет в подпрограмме setup
. Другими словами, я делаю задачей setup
подпрограмму создавать представления и назначать их слабым ссылкам, одновременно помещая их в интерфейс.
Еще одна возможность, конечно, просто сбросить weak
и больше ничего не делать. Сделайте textField
сильной ссылкой! Нет абсолютно ничего плохого в наличии сильной ссылки на подпредставление - если, конечно, это подпредставление также не имеет сильной ссылки на вас, но это маловероятно и может быть предотвращено в случае возникновения.