Я немного упростил проблему и воссоздал ее, так что вы захотите добавить код, который я удалил. Этот код выдает ту же ошибку:
class CustomTextField {
var leftIcon: String = ""
private let leftIconView: UIImageView = {
let icon = UIImage(systemName: leftIcon) // <--- Error here
let imageView = UIImageView(image: icon)
return imageView
}()
}
И отследил проблему.
Проблема в том, что инициализация leftIconView
на самом деле происходит в контексте static
до вызова инициализатора, поэтому вы не можете ссылаться на свойства экземпляра. Я нашел два простых решения, первое — сделать leftIconView
lazy var
вместо let
:
class CustomTextField {
var leftIcon: String = ""
private lazy var leftIconView: UIImageView = {
let icon = UIImage(systemName: leftIcon)
let imageView = UIImageView(image: icon)
return imageView
}()
}
Второе решение — просто инициализировать leftIconView
в инициализаторе.
class CustomTextField {
var leftIcon: String = ""
private let leftIconView: UIImageView
override init()
{
let icon = UIImage(systemName: leftIcon)
self.leftIconView = UIImageView(image: icon)
}
}
Это второе решение, вероятно, потребует, чтобы вы также реализовали некоторые другие инициализаторы для UIView
, как только вы вернете это наследование, и, конечно, вам нужно будет вызвать super.init
в конце инициализатора.
Приложение
Приведенное выше решение действительно исправило ошибку компиляции, но на самом деле значок появился в CustomTextField
, требуемом с помощью наблюдателя свойств на leftIcon
class CustomTextField: UITextField, UITextFieldDelegate {
//"person"
private var showPassword: Bool = false
var leftIcon: String = ""
{
didSet
{
leftIconView = makeImageView(for: leftIcon)
// leftView is the view that is actually displayed. It's set
// once in the initializer, so now that we're updating
// leftIconView, we have to update leftView as well
leftView = leftIconView
// Maybe also do this
leftView?.setNeedsDisplay()
}
}
private lazy var leftIconView: UIImageView = {
makeImageView(for: leftIcon)
}()
private func makeImageView(for imageName: String) -> UIImageView {
let icon = UIImage(systemName: imageName )
let imageView = UIImageView(image: icon)
imageView.contentMode = .scaleAspectFit
imageView.tintColor = .white
return imageView
}
...
}
person
Chip Jarred
schedule
02.04.2021
ViewController
параметр строкиtextfield
былvar textfield = CustomTextField
без вызова инициализатора, но вы вызываете его, поэтому, если нет других ошибок, которые были бы важны, для меня это загадка. - person Chip Jarred   schedule 02.04.2021let icon = UIImage(systemName: leftIcon)
? - person Chip Jarred   schedule 02.04.2021viewDidLoad()
? - person Chip Jarred   schedule 02.04.2021