简体   繁体   English

iOS(Swift):UITextField是不是成为firstFirstsponder方法后的第一响应者吗?

[英]iOS (Swift): UITextField is **not** first responder after becomeFirstResponder method is called?

I have an array of UITextField s inside a UIViewController : 我在UIViewController有一个数组UITextField

@IBOutlet weak var textField1: UITextField!
@IBOutlet weak var textField2: UITextField!
var textFields: [UITextField] {
    return [textField1, textField2]
}

In my viewDidLoad method, I set the first element of the textFields array to be the first responder and set all of their delegates as follows: 在我的viewDidLoad方法中,我将textFields数组的第一个元素设置为第一个响应者,并将其所有委托设置如下:

override func viewDidLoad() {
    super.viewDidLoad()

    textFields[0].becomeFirstResponder()
    textFields.forEach({ $0.delegate = self })

    print(textFields.map({ $0.isFirstResponder })) // [false, false]

}

However, the print statement in the viewDidLoad prints [false, false] rather than [true, false] as I might have expected. 但是, viewDidLoad的print语句会打印[false, false]而不是我可能期望的[true, false] Why? 为什么?

Thanks 谢谢

You're running this code too soon. 您运行该代码的时间过早。 No text field can become first responder during viewDidLoad , because no text field is even in the interface yet. viewDidLoad期间,没有文本字段可以成为第一响应者,因为界面中甚至没有文本字段。

To put it another way, try changing your code to: 换句话说,请尝试将代码更改为:

print(textFields.map({ $0.window == nil }))

You'll get [true, true] , proving that the text fields are not yet in any window. 您将得到[true, true] ,证明文本字段尚未在任何窗口中。 But first responder status is window-based; 但是第一响应者的状态是基于窗口的; a free-floating text field cannot be first responder. 自由浮动文本字段不能是第一响应者。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM