[英]Code only works within a DispatchQueue.main.async block, why?
当用户开始编辑UITextField时,我编写了以下代码来选择所有文本:
@IBAction func onEditingBegin(_ sender: Any) {
print("editing began")
let textfield = sender as! UITextField
textfield.selectAll(nil)
}
但是,直到我将textfield.selectAll(nil)
行包含在DispatchQueue.main.async
块中之后,它才起作用:
DispatchQueue.main.async {
textfield.selectAll(nil)
}
这是为什么?
我还在onEditingBegin()
打印出了线程的名称,这就是结果:
<NSThread: 0x60800006c880>{number = 1, name = main}
因此,似乎已经在主线程上将其触发,但是除非在DispatchQueue.main.async
块内部调用textfield.selectAll()
否则代码仍然无法正常工作。
调用DispatchQueue.main.async
的真正效果是增加了微小的延迟 。 特别是,此延迟足够长,足以允许当前运行循环结束并启动下一个运行循环。 因此,允许将事件发送给您的操作(调用onEditingBegin
)可以完成 。 现在,文本字段正在编辑中,因此我们准备好进行下一步,即选择其内容。
您发现的技巧实际上是iOS编程中经常需要的东西。 可可是一个复杂的框架,界面的操作有时可能会绊倒在彼此的脚上,如此处所示-当用户开始在文本字段中进行编辑时,您正在尝试选择文本字段的文本。 有时,我们只需要运行循环再出现一次,以允许接口在进行下一步之前就“解决”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.