如何将 UIApplicationDelegate 添加到 UIResponder 链的末尾?

Posted

技术标签:

【中文标题】如何将 UIApplicationDelegate 添加到 UIResponder 链的末尾?【英文标题】:How do I add the UIApplicationDelegate to the end of the UIResponder chain? 【发布时间】:2010-07-28 19:51:06 【问题描述】:

我正在尝试提供一个IBAction 方法来实现应用程序各个部分所需的通用功能。

即登录是以模态方式实现的,如果成功,则会产生一个通知,允许所有加载的视图控制器对此事件做出反应(从匿名转换到认证)

@interface MyAppDelegate : NSObject <UIApplicationDelegate>

  ...

- (IBAction)loginTapped:(id)sender;
@end

我将该按钮的操作设置为 IB 中的第一响应者,但是响应者链没有给 MyAppDelegate 响应的机会。

我的问题是,我不想在响应者链的各个部分复制该方法,我想将它添加到已经是子类的公共类中。

UIResponder 链一直到UIApplication,但这似乎是结束了。我的UIApplicationDelegate 无法参与。

我想将我的应用代理插入或添加到响应者链中!

(或找到另一种方法将 UIButton touch-up-inside 连接到应用程序范围的实现。如果可能,我想避免子类化 UITabBarControllerUIWindow

【问题讨论】:

【参考方案1】:

如果它是UIResponder 子类,您可以将UIApplication 子类化以让-nextResponder 返回应用程序委托。然后,您需要更改对 UIApplicationMain 的调用以使用您的自定义子类。

我自己没有尝试过,但我想不出这会导致任何直接的问题。

【讨论】:

如果可能的话,我想避免子类化任何东西。 Apple 文档指导您远离子类化 UIApplication“很少有有效的需要扩展此类;...非常确定您要使用子类完成什么。” 【参考方案2】:

ios 5 开始,AppDelegate 自动成为响应者链中的最后一个链接。 Xcode 项目模板将创建一个 AppDelegate,它是 UIResponder 而不是 NSObject 的子类。但是,为避免混淆 AppDelegate,请覆盖 AppDelegate 的 nextResponder 并将工作卸载到自定义 UIResponder 对象中:

- (UIResponder *)nextResponder

    static dispatch_once_t onceToken;
    static LastUIResponder *lastResponder = nil;
    dispatch_once(&onceToken, ^
        lastResponder = [[LastUIResponder alloc] init];
    );
    return lastResponder;

【讨论】:

以上是关于如何将 UIApplicationDelegate 添加到 UIResponder 链的末尾?的主要内容,如果未能解决你的问题,请参考以下文章

如何在命令行 GHUnit 中使用 UIApplicationDelegate?

将 UIApplicationDelegate 方法转换为 RxSwift Observables

无法使用 [UIApplication sharedApplication]。如何在 UIApplicationDelegate 之外注册通知?

什么是 Cordova 的 UIApplicationDelegate 等价物

如何从 UIApplicationDelegate 实例“重新启动”iOS 应用程序/重新实例化初始视图控制器?

UIApplicationDelegate 与 NSApplicationDelegate、MainMenu.xib