我在UITextField
:
UIViewController
s
@IBOutlet weak var textField1: UITextField!
@IBOutlet weak var textField2: UITextField!
var textFields: [UITextField] {
return [textField1, textField2]
}
在我的viewDidLoad
方法中,我将textFields
数组的第一个元素设置为第一个响应者,并将其所有委托设置如下:
override func viewDidLoad() {
super.viewDidLoad()
textFields[0].becomeFirstResponder()
textFields.forEach({ $0.delegate = self })
print(textFields.map({ $0.isFirstResponder })) // [false, false]
}
然而,viewDidLoad
中的print语句打印[false, false]
而不是[true, false]
,正如我可能预期的那样。为什么呢?
由于
答案 0 :(得分:4)
您过早运行此代码。在viewDidLoad
期间,没有文本字段可以成为第一响应者,因为在界面中甚至没有文本字段。
换句话说,请尝试将代码更改为:
print(textFields.map({ $0.window == nil }))
您将获得[true, true]
,证明文本字段尚未出现在任何窗口中。但第一响应者状态是基于窗口的;自由浮动的文本字段不能是第一响应者。