[英]What is first responder?
根據 Apple 的文檔:
當您的應用程序收到事件時,UIKit 會自動將該事件定向到最合適的響應者 object,稱為第一響應者。
同一文檔解釋了如何確定第一響應者:
UIView的hitTest:withEvent:方法遍歷視圖層級,尋找最深的包含指定觸摸的子視圖,成為觸摸事件的第一響應者。
我不明白的是為什么 UIResponder 有一個名為isFirstResponder
的屬性? 以及為什么存在becomeFirstResponder
。 第一響應者不應該由 UIKit 根據特定觸摸事件的位置動態確定嗎?
此外, canBecomeFirstResponder
為UIView
返回NO
,這顯然是不正確的,因為視圖會處理觸摸事件。
我認為可以解決這種混淆的唯一方法是,如果所有這些方法都只與搖動、遠程控制和編輯菜單類型的事件相關。 但是文檔對此並不清楚。
我不明白的是為什么 UIResponder 有一個名為
firstResponder
的屬性?
沒有。 UIResponder
沒有名為firstResponder
的公共屬性。
以及為什么存在
becomeFirstResponder
。
becomeFirstResponder
的主要用途是以編程方式選擇哪個文本字段獲取鍵盤事件。
第一響應者不應該根據特定觸摸事件的位置由 UIKit 動態確定嗎?
事件的種類比觸摸事件多。 例如,有鍵盤事件和動作事件。 UIKit 跟蹤的第一響應者用於非觸摸事件。 在其他系統中,這個概念通常被稱為“焦點”或更具體地說是“鍵盤焦點”。 但是(在 iOS 中)第一響應者可以是不響應鍵盤事件的視圖。
此外,
canBecomeFirstResponder
為UIView
返回NO
,這顯然是不正確的,因為視圖會處理觸摸事件。
沒關系,因為觸摸事件並不是真正從第一響應者開始的。 它們從-[UIView hitTest:withEvent:]
返回的視圖開始。
我認為可以解決這種混淆的唯一方法是,如果所有這些方法都只與搖動、遠程控制和編輯菜單類型的事件相關。 但是文檔對此並不清楚。
以first responder開頭的non-touch event的種類比較多,除此之外,你已經正確解決了。
這不是一個“快速回答”的主題——最好的辦法是進行一些搜索並通讀幾篇關於它的文章。
但是,簡而言之...
.becomeFirstResponder()
通常用於激活文本字段而無需用戶點擊該字段。 常見的情況是有多個文本字段(填寫界面的表單類型),您會根據輸入自動“跳轉”到下一個字段:
myTextField.becomeFirstResponder()
同樣,正如您在瀏覽文檔時已經看到的那樣,它遠不止於此……但這里的答案太多了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.