为啥类 AppDelegate 继承自 UIResponder?

Posted

技术标签:

【中文标题】为啥类 AppDelegate 继承自 UIResponder?【英文标题】:Why does class AppDelegate inherit from UIResponder?为什么类 AppDelegate 继承自 UIResponder? 【发布时间】:2016-04-02 20:03:19 【问题描述】:

已经有这样的问题得到了回答,但是我对答案不满意:Why does AppDelegate inherit from UIResponder?。

我想了解更多细节,因为我正在尝试了解 ios 应用的架构。

据我所知,UIResponder 用于“响应”外力(即触摸事件、运动事件等)的事物。 为什么应用程序的初始化需要是 UIResponder?也许我不明白 AppDelegate 的实例是做什么的。

【问题讨论】:

我想我现在明白了 AppDelegate 的作用:developer.apple.com/library/ios/documentation/UIKit/Reference/…。但是,我仍然不确定为什么 AppDelegate 继承自 UIResponder。 请注意,外部事件可以有多种类型,而不仅仅是物理交互。例如,响应后台模式(进入后台,在其他应用程序需要时停止音频等)正是 UIResponder 应该管理的事情。按照委托模式,应用程序本身(我的意思是UIApplication)应该管理它,但它委托给适当的对象(应用程序委托)。 谢谢,@AlejandroIván。所以,让我澄清一下(缺乏适当的术语): UIResponder 跨越操作系统,而 UIApplication 特定于每个应用程序?如果我错了,请纠正我。 让我换一种说法:用户点击操作系统上的一个图标,它会实例化一个UIApplication(您点击的应用程序)。 UIApplication 是一个需要做几件事的对象,包括响应输入。由于应用程序对象本身会做出不同的响应(取决于程序员希望它做什么),它会将工作“委托”给应用程序委托。当然,该委托需要遵循与应用程序本身通信的协议,因此它继承自 UIResponder 类,该类实现了大多数方法(并且您覆盖了特定应用程序的需求)。 我不确定官方来源(文档非常冗长,让每个人都感到困惑)。我建议你阅读这篇文章,它应该澄清:oleb.net/blog/2011/06/app-launch-sequence-ios 【参考方案1】:

应用程序委托类继承自 UIResponder。

这是为了让委托实例可以参与响应者链,从而处理应用程序级别的操作。

编辑:

从 iOS 5 开始,有一个步骤 6:应用程序委托获得最终决定权 事件。从 iOS 5 开始,应用程序委托继承自 UIResponder 不再像以前那样来自 NSObject。

简而言之:首先是视图,如果视图有视图控制器,那么, 接下来是superview,直到层次结构的顶部,即窗口。从 到应用程序,最后到应用程序委托。

欢迎将应用委托添加为潜在响应者 另外,因为我们很少(如果有的话)子类 UIApplication 或 界面窗口。但是我们总是有自己的应用程序委托,如果只是为了创建 窗口并在 application:didFinishLaunching... 委托方法。所以这恰好是 响应者事实上最好的地方,如果有的话 在整个视图层次结构中都没有。

取自:

https://www.cocoanetics.com/2012/09/the-amazing-responder-chain/

【讨论】:

好吧,这是有道理的。响应者链是如何工作的? @SirJony developer.apple.com/library/ios/documentation/EventHandling/… 好的,谢谢 Roee84 和 PhilipsMillis。我会看看你的消息来源。

以上是关于为啥类 AppDelegate 继承自 UIResponder?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 C# 中的集合类(如 ArrayList)继承自多个接口,如果其中一个接口继承自其余接口?

为啥我在 AppDelegate 中的 AVPlayer 类引用返回 nil?

为啥类不能从 decltype 的结果继承?

为啥我的C#Winform自定义控件,继承Control类,然后重写onpaint事件,设计窗体拖动时只剩下外框!

Unity脚本类为啥要尽量避免继承MonoBehaviour类

为啥 C# 中的基类允许实现接口契约而不继承它?