我编写此代码以在用户开始编辑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()
这是结果:
所以看起来它已经在主线程上被触发了,但代码仍然无法工作,除非textfield.selectAll()
在DispatchQueue.main.async
块内部调用.
你的呼叫的真正效果DispatchQueue.main.async
是增加一点微小的延迟.特别是,这种延迟足够长,足以让当前的runloop完成并启动下一个runloop.onEditingBegin
因此,允许完成导致事件发送给您的操作,即调用.文本字段现在正在编辑,因此我们准备好进行下一步,即选择其内容.
你发现的技巧实际上是iOS编程中经常需要的东西.Cocoa是一个复杂的框架,界面的操作有时可能会绊倒彼此的脚,就像这里一样 - 当用户开始在文本字段中编辑时,您试图选择文本字段的文本.有时我们只需要runloop再次出现,以便在继续下一步之前允许界面"安定下来".