如何将 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 连接到应用程序范围的实现。如果可能,我想避免子类化 UITabBarController
或 UIWindow
)
【问题讨论】:
【参考方案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 等价物