[英]How do Responder Chain Works in IPhone? What are the “next responders”?
這就是文檔所說的:
如果第一響應者 [對事件或動作消息] 無法處理事件或動作消息,它會將其轉發給稱為響應者鏈的鏈接系列中的“下一個響應者”。 響應者鏈允許響應者對象將處理事件或動作消息的責任轉移給應用程序中的其他對象。
如果響應者鏈中的 object 無法處理事件或動作,它會將消息重新發送給鏈中的下一個響應者。 消息沿着鏈向上傳播,到達更高級別的對象,直到被處理。 如果未處理,則應用程序將其丟棄。
好的,下一個響應者是什么?
是父視圖嗎? 背后的風景? iOS 如何決定什么是第一響應者和第二響應者?
First Responder 是 Cocoa 中一個非常具體的概念。 iOS 決定設置 First Responder 的唯一時間是文本字段獲得焦點時。 在所有其他時間,您必須明確控制您希望哪個 object 成為第一響應者(請參閱 -canBecomeFirstResponder、-becomeFirstResponder)。
沒有第二響應者之類的東西。
所有響應者都有一個NextResponder ,(可以為零)。 這意味着從任何響應者開始,可能(但可能不是)任意長度的響應者鏈( responseer -> nextResponder -> nextResponder -> etc ),事件沿着這些鏈傳遞直到它們被處理。
有一個默認鏈可以是 view -> superview -> superview 但也可能包括UIViewControllers、UIWindows、UIWindowControllers、UIApplication等等,所以它在很大程度上取決於你的 object 層次結構(不僅僅是你的視圖層次結構 - 所以不,你可以' t 說 nextResponder 始終是父視圖)。 在 OSX 10.6 上,對於不同類型的事件和操作,默認鏈甚至不同,甚至可以包括您的應用程序委托,它可能是也可能不是響應者,我不確定 iOS 是否是這種情況。
默認鏈只是默認鏈,因此在您管理了 First Responder 之后,您可以在其響應者鏈中插入、刪除和 append 項目以實現您想要的目標。
響應者鏈非常重要且復雜,您應該花時間閱讀有關它的 Apple 文檔。
來自nextResponder的文檔:
UIResponder class 不會自動存儲或設置下一個響應者,而是默認返回 nil。 子類必須重寫此方法以設置下一個響應者。 UIView 通過返回管理它(如果有)或其上級視圖(如果沒有)的 UIViewController object 來實現此方法; UIViewController 通過返回其視圖的父視圖來實現該方法; UIWindow 返回應用程序 object,UIApplication 返回 nil。
應用程序使用響應者對象接收和處理事件。
響應者 object 是UIResponder class 的任何實例,
常見的子類包括
UIView、UIViewController 和 UIApplication 。
響應者接收原始事件數據並且必須處理該事件或將其轉發給另一個響應者 object。
當您的應用收到事件時,UIKit 會自動將該事件定向到
最合適的響應者 object,稱為
急救人員。
未處理的事件在活動響應者鏈中從響應者傳遞到響應者,
這是您應用的響應者對象的動態配置。
現在看下面的屏幕截圖,還要考慮前面的 View-Hierarchies:
UIbutton/UITextField --(nextResponder)-> UIView --(nextResponder)-> UIViewController
--(nextResponder)-> UIWindow --(nextResponder)-> UIApplication --(nextResponder)-> UIApplicationDelegate
這就是 Responder 鏈在 iOS 上的工作方式,希望它對任何人都有幫助 另外 Apple 網站上的最新文章是 --> 鏈接(很好解釋。)
任何事件的響應者鏈是
UIView -> ViewController -> 窗口-> App Delegate
運行以下代碼以更好地理解。
//
// AppDelegate.swift
// ResponderChain
//
// Created by Ankit on 02/09/17.
// Copyright © 2017 Ankit. All rights reserved.
//
import UIKit
@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
return true
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
print("App Delegate touch began")
}
}
//
// ViewController.swift
// ResponderChain
//
// Created by Ankit on 02/09/17.
// Copyright © 2017 Ankit. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
print("ViewController touch Began")
next?.touchesBegan(touches, with: event)
}
}
extension UIWindow{
open override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
print("Window Touch Began")
next?.touchesBegan(touches, with: event)
}
}
extension UIView{
open override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
print("UIView touch Began")
next?.touchesBegan(touches, with: event)
}
}
響應者鏈是一系列鏈接的響應者對象。 它從第一響應者開始,到應用程序 object 結束。 如果第一響應者無法處理事件,它會將事件轉發給響應者鏈中的下一個響應者。
響應者 object 是可以響應和處理事件的 object。 UIResponder class 是所有響應者對象的基礎 class,它不僅為事件處理定義了編程接口,還為常見的響應者行為定義了編程接口。 UIApplication、UIViewController 和 UIView 類的實例是響應者,這意味着所有視圖和大多數關鍵 controller 對象都是響應者。 請注意,核心 Animation 層不是響應者。
第一響應者被指定首先接收事件。 通常,第一響應者是視圖 object。 object 通過做兩件事成為第一響應者:
Overriding the canBecomeFirstResponder method to return YES.
Receiving a becomeFirstResponder message. If necessary, an object can send itself this message.
有關更多說明,請參閱 Apple 文檔。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.