How do I add the UIApplicationDelegate to the end of the UIResponder chain?

跟風遠走 提交于 2019-12-06 02:58:39

问题


I'm trying to provide an IBAction method for common functionality that is required at various parts of the app.

i.e. Login is implemented modally, and if it succeeds results in a notification that allows all loaded view controllers to react to this event (transition from anonymous to authenticated)

@interface MyAppDelegate : NSObject <UIApplicationDelegate>
{
  ...
}
- (IBAction)loginTapped:(id)sender;
@end

I set the action of that button to the First Responder in IB, however the responder chain doesn't give MyAppDelegate a chance to respond.

My problem is that, I don't want to replicate the method at various parts of the responder chain, I would like to add it to a common class that is already a subclass.

The UIResponder chain goes all the way through to the UIApplication but that seems to be the end. My UIApplicationDelegate doesn't get to participate.

I want to insert or add my app delegate to the responder chain!

(or find another way to hook up the UIButton touch-up-inside to an app-wide implementation.. I want to avoid subclassing the UITabBarController or UIWindow if possible)


回答1:


You could subclass UIApplication to have -nextResponder return the application delegate if it is a UIResponder subclass. You'll then need to alter your call to UIApplicationMain to use your custom subclass.

I haven't tried this myself, but I can't think of any immediate problems this would cause.




回答2:


Starting with iOS 5, the AppDelegate is automatically the last link in the responder chain. Xcode project templates will create an AppDelegate that is a subclass of UIResponder rather than NSObject. However, to avoid cluttering up the AppDelegate, override the AppDelegate's nextResponder and offload work into a custom UIResponder object:

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


来源:https://stackoverflow.com/questions/3356863/how-do-i-add-the-uiapplicationdelegate-to-the-end-of-the-uiresponder-chain

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!