我正在编写一个通用类,可以通过链接在不同的项目中使用
在某个时刻,我在一个拥有该对象的侦听器上调用一个方法,并通过赋值保存到该类中。
但有时候,调用者可能会消失,所以我希望在这种情况下将返回消息路由到应用程序委托。
以下是我对调用者的处理方式(调用者是创建并拥有我的类实例的调用者):
if ([self.responseListener respondsToSelector:@selector(serverAnswered:error:)]) {
// some job to construct the return object
[self.responseListener performSelector:@selector(serverAnswered:error:) withObject:response withObject:nil];
}
当调用者丢失时,如何引用app delegate类代替responseListener?
答案 0 :(得分:3)
我不确定你对“来电者”中的“来电者”的意思是什么意思。以下是您可以从任何地方访问应用程序委托的方法。
[UIApplication sharedApplication].delegate;
如果您需要调用特定应用程序委托所独有的方法,则需要导入并转换。
#import "MyAppDelegate.h"
// ...
MyAppDelegate *appDelegate = (MyAppDelegate *)[UIApplication sharedApplication].delegate;
<强>更新强>
要在任何应用委托上调用您自己的库方法,请使用协议。
// The app delegate in your library users app
#import "YourFancyLibrary.h"
@interface MyAppDelegate : NSObject <UIApplicationDelegate, YourFancyLibraryDelegate>
// In YourFancyLibrary.h, declare that protocol
@protocol YourFancyLibraryDelegate
- (void)myFancyMethod;
@end
// Refer to it in the guts of your library.
id<YourFancyLibraryDelegate> delegate = [UIApplication sharedApplication].delegate;
if (![delegate conformsToProtocol:@protocol(YourFancyLibraryDelegate)]) return;
if (![delegate respondsToSelector:@selector(myFancyMethod)]) return;
[delegate myFancyMethod];
这将使您的API在您指定库用户需要实现的方法时变得清晰,并且是一个很好的解决方案,因为它允许编译时检查而不是依赖于运行时动态消息发送。
您也可以跳过协议,直接调用方法。
id appDelegate = [UIApplication sharedApplication].delegate;
SEL methodToCall = @selector(someMethod);
if ([appDelegate respondsToSelector:methodToCall]) {
[appDelegate performSelector:methodToCall];
}