这是文档所说的:
如果第一响应者[对事件或动作消息]无法处理事件或动作消息,它会将其转发到称为响应者链的链接系列中的“下一个响应者”。响应者链允许响应者对象将处理事件或动作消息的责任转移给应用程序中的其他对象。
如果响应者链中的对象无法处理事件或操作,它会将消息重新发送到链中的下一个响应者。消息向上传递到更高级别的对象,直到它被处理。如果没有处理,应用程序会丢弃它。
好的,下一个响应者是什么?
是父视图吗?它背后的观点? iOS如何确定第一响应者和第二响应者是什么?
答案 0 :(得分:29)
First Responder是Cocoa中一个非常具体的概念。 iOS决定设置第一响应者的唯一时间是文本字段获得焦点。在所有其他时候,您必须明确控制您想成为第一个响应者的对象(请参阅-canBecomeFirstResponder,-becomeFirstResponder)。
没有第二响应者这样的事情。
所有响应者都有 NextResponder ,(可以是nil)。这意味着从任何响应者开始可能(但可能不是)任意长度的响应者链(响应者 - > nextResponder - > nextResponder - >等)沿着这些响应者传递事件直到他们被处理了。
有一个可以查看的默认链 - > superview - > superview但也可能包括 UIViewControllers,UIWindows,UIWindowControllers,UIApplication 等等,所以它在很大程度上取决于你的对象层次结构(不仅仅是你的视图层次结构 - 所以不,你不能说nextResponder总是父视图)。在OSX 10.6上,默认链对于不同类型的事件和操作甚至是不同的,甚至可以包括你的应用程序委托,它可能是也可能不是响应者,我不确定这是否是iOS的情况。
默认链只是默认的链,所以在您管理了第一响应者后,您需要插入,删除项目并将其附加到响应者链以实现您的目标。
响应者链非常重要和复杂,您应该花时间阅读有关它的Apple文档。
答案 1 :(得分:18)
来自nextResponder的文档:
UIResponder类不存储或设置下一个响应者 自动,默认返回nil。子类必须 覆盖此方法以设置下一个响应者。 UIView实现了这一点 方法通过返回管理它的UIViewController对象(如果它 有一个)或它的超级视图(如果没有); UIViewController实现 返回视图的超视图的方法; UIWindow返回 应用程序对象,UIApplication返回nil。
答案 2 :(得分:4)
应用程序使用响应者对象接收和处理事件。
响应者对象是 UIResponder 类的任何实例,
常见的子类包括
UIView,UIViewController和UIApplication 。
响应者接收原始事件数据,并且必须处理事件或将其转发到另一个响应者对象。
您的应用收到事件后,UIKit会自动将该事件定向到
最合适的响应者对象,称为
第一响应者。
未处理的事件从响应者传递到活动响应者链中的响应者,
是应用程序响应者对象的动态配置。
现在看下面的屏幕截图,还要考虑前面的View-Hierarchies:
UIbutton / UITextField -(nextResponder)-> UIView -(nextResponder)-> < strong> UIViewController
-(nextResponder)-> UIWindow –(nextResponder)-> UIApplication -(nextResponder)-> UIApplicationDelegate >
这就是Responder链在iOS上的工作方式,希望对任何人都有用。另外,苹果网站上的最新文章是-> Link(非常好解释。)
答案 3 :(得分:3)
任何事件的响应者链都是
UIView - &gt; ViewController - &gt;窗口 - &GT;应用代表
运行以下代码以便更好地理解。
//
// 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)
}
}
答案 4 :(得分:2)
响应者链是一系列链接的响应者对象。它从第一个响应者开始,以app对象结束。如果第一个响应者无法处理事件,它会将事件转发给响应者链中的下一个响应者。
响应者对象是可以响应和处理事件的对象。 UIResponder类是所有响应器对象的基类,它定义了程序接口,不仅用于事件处理,还用于常见的响应器行为。 UIApplication,UIViewController和UIView类的实例是响应者,这意味着所有视图和大多数关键控制器对象都是响应者。请注意,Core Animation图层不是响应者。
第一响应者被指定首先接收事件。通常,第一响应者是视图对象。通过做两件事,对象成为第一个响应者:
Overriding the canBecomeFirstResponder method to return YES.
Receiving a becomeFirstResponder message. If necessary, an object can send itself this message.
请参阅Apple文档以获取更多解释。