响应者链如何在iPhone中工作?什么是"下一个响应者"?

use*_*951 27 iphone objective-c uiresponder ios

这是文档说的:

如果[事件或动作消息]的第一响应者无法处理事件或动作消息,则它将其转发到称为响应者链的链接系列中的"下一个响应者".响应者链允许响应者对象将处理事件或动作消息的责任转移到应用程序中的其他对象.

如果响应者链中的对象无法处理事件或操作,它会将消息重新发送到链中的下一个响应者.消息向上传递到更高级别的对象,直到它被处理.如果未处理,应用程序将丢弃它.

好的,下一个响应者是什么?

是父视图吗?它背后的观点?iOS如何确定第一响应者和第二响应者?

hoo*_*oop 30

First Responder是Cocoa中一个非常具体的概念.iOS决定设置First Responder 的唯一时间是文本字段获得焦点.在所有其他时候,您必须明确控制您想成为第一个响应者的对象(请参阅-canBecomeFirstResponder,-becomeFirstResponder).

没有第二响应者这样的事情.

所有响应者都有一个NextResponder(可以是nil).这意味着从任何响应者开始可能(但可能不是)任意长度的响应链(响应者 - > nextResponder - > nextResponder - >等),事件一直传递到它们直到它们被处理.

有一个默认链可以是视图 - > superview - > superview但也可能包括UIViewControllers,UIWindows,UIWindowControllers,UIApplication等等,所以它在很大程度上取决于你的对象层次结构(不仅仅是你的视图层次结构 - 所以不,你可以' t say nextResponder始终是父视图).在OSX 10.6上,默认链对于不同类型的事件和操作甚至是不同的,甚至可以包括您的应用程序委托,它可能是也可能不是响应者,我不确定在iOS中是否是这种情况.

默认链只是默认的tho,因此在您管理了First Responder之后,您可以插入,删除项目并将其附加到响应程序链以实现您的目标.

响应者链非常重要和复杂,您应该花时间阅读有关它的Apple文档.


Max*_*Max 18

来自nextResponder的文档:

UIResponder类不会自动存储或设置下一个响应程序,而是默认返回nil.子类必须覆盖此方法以设置下一个响应者.UIView通过返回管理它的UIViewController对象(如果有的话)或超级视图(如果没有)来实现此方法; UIViewController通过返回其视图的superview来实现该方法; UIWindow返回应用程序对象,UIApplication返回nil.


Yas*_*edi 6

应用程序使用响应者对象接收和处理事件。

响应者对象是UIResponder类的任何实例,

  • 常见的子类包括

    UIView、UIViewController 和 UIApplication

响应者接收原始事件数据,并且必须处理事件或将其转发到另一个响应者对象。

当你的应用收到一个事件时,UIKit 会自动将该事件指向

  • 最合适的响应者对象,称为

    急救人员。

未处理的事件在活动响应者链中从响应者传递到响应者,

这是您的应用响应者对象的动态配置。

现在看下面的屏幕截图,还要从前面考虑 View-Hierarchies:

图片

UIbutton/UITextField --(nextResponder)-> UIView --(nextResponder)-> UIViewController

--(nextResponder)-> UIWindow --(nextResponder)-> UIApplication --(nextResponder)-> UIApplicationDelegate

这就是Responder链在iOS上的工作方式,希望它可以帮助任何人Apple网站上的最新文章是-> 链接(很好解释。)


Ank*_*arg 5

任何事件的响应者链是

\n\n

UIView -> ViewController -> 窗口 -> 应用程序委托

\n\n

运行以下代码以便更好地理解。

\n\n
//\n//  AppDelegate.swift\n//  ResponderChain\n//\n//  Created by Ankit on 02/09/17.\n//  Copyright \xc2\xa9 2017 Ankit. All rights reserved.\n//\n\nimport UIKit\n\n@UIApplicationMain\nclass AppDelegate: UIResponder, UIApplicationDelegate {\n\n    var window: UIWindow?\n\n\n    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {\n        // Override point for customization after application launch.\n        return true\n    }\n\n   override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {\n        print("App Delegate touch began")\n    }\n\n\n}\n\n\n\n//\n//  ViewController.swift\n//  ResponderChain\n//\n//  Created by Ankit on 02/09/17.\n//  Copyright \xc2\xa9 2017 Ankit. All rights reserved.\n//\n\nimport UIKit\n\nclass ViewController: UIViewController {\n\n    override func viewDidLoad() {\n        super.viewDidLoad()\n        // Do any additional setup after loading the view, typically from a nib.\n    }\n\n    override func didReceiveMemoryWarning() {\n        super.didReceiveMemoryWarning()\n        // Dispose of any resources that can be recreated.\n    }\n    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {\n        print("ViewController touch Began")\n        next?.touchesBegan(touches, with: event)\n    }\n\n\n}\n\nextension UIWindow{\n    open override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {\n        print("Window Touch Began")\n        next?.touchesBegan(touches, with: event)\n    }\n}\nextension UIView{\n    open override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {\n        print("UIView touch Began")\n        next?.touchesBegan(touches, with: event)\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n