[英]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.