I have a UITextField
sets up in UICollectionViewCell
. I've used closure to declare the UITextField as follows:
var nameTextField: UITextField = {
let textfield = UITextField()
textfield.backgroundColor = .clear
textfield.borderStyle = .line
textfield.placeholder = "Name"
textfield.textColor = UIColor.white
textfield.layer.borderColor = UIColor.white.cgColor
textfield.addTarget(self, action: #selector(textfieldDidChangeValue), for: .editingChanged)
textfield.translatesAutoresizingMaskIntoConstraints = false
return textfield
}()
It is supposed that when textfield's content is changed, the .editingChanged
event would be called and then call function textfieldDidChangeValue
. It works well in iOS simulator, but not working in my real iPhone 12 Pro device. It is my first time to face problem of different behavior between simulator and real device. What is the possible fix for it? Thank you.
Xcode: Version 13.3.1 (13E500a)
iOS simulator: iOS 14.7 iPhone 13 pro
real device: iOS 14.7.1 iPhone 12 pro
CodePudding user response:
I finally figure out why it is not working to addTarget
when declaring the UITextField
. Because the self
is not ready when target is added. I should make the variable lazy
to guarantee self
is available.
lazy var nameTextField: UITextField = {
let textfield = UITextField()
textfield.backgroundColor = .clear
textfield.borderStyle = .line
textfield.placeholder = "Name"
textfield.textColor = UIColor.white
textfield.layer.borderColor = UIColor.white.cgColor
textfield.addTarget(self, action: #selector(textfieldDidChangeValue), for: .editingChanged)
textfield.translatesAutoresizingMaskIntoConstraints = false
return textfield
}()