iPhone - 在泛型类中引用应用程序委托
Posted
技术标签:
【中文标题】iPhone - 在泛型类中引用应用程序委托【英文标题】:iPhone - Referencing the application delegate within a generic class 【发布时间】:2011-07-30 13:29:31 【问题描述】:我正在编写一个可以通过链接在不同项目中使用的通用类。 在某个时刻,我在一个监听器上调用一个方法,该方法由拥有该对象的监听器提供,并通过分配保存到类中。 但有时,该调用者可能会消失,因此我希望在这种情况下将返回消息路由到应用程序委托。
这是我为调用者做的事情(调用者是创建并拥有我的类的实例的那个):
if ([self.responseListener respondsToSelector:@selector(serverAnswered:error:)])
// some job to construct the return object
[self.responseListener performSelector:@selector(serverAnswered:error:) withObject:response withObject:nil];
当调用者消失时,我如何引用应用委托类来代替 responseListener?
【问题讨论】:
【参考方案1】:我不确定“当来电者消失时”中的“来电者”是什么意思。不过,您可以通过以下方式从任何地方访问应用程序委托。
[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];
【讨论】:
是的,我想在应用委托上调用自定义方法。由于我的类是通用的并且可以包含在不同的项目中,因此该类不知道它所包含的项目中使用的应用程序委托类的名称。有没有办法在不知道类的情况下编写第二个调用应用委托的名称。 正确的做法是要求你的库的用户在他们的应用委托中实现一个协议。我会更新我的答案。 我同意,但我不能强制应用程序实现仅在某些特定情况下调用的方法,这种情况发生在对通用对象触发特定调用时。对于泛型类中实现的所有其他方法,这是没有用的。所以我更愿意检查应用代理是否实现了该方法,如果没有,则转到第三条路线。 您可以将协议方法设为可选,并检查应用代理是否响应它。将再次更新我的答案。 那么就使用[[UIApplication sharedApplication].delegate performSelector:....]
?此外,您可以使用conformsToProtocol
检查应用程序委托是否符合协议。再次更新答案。以上是关于iPhone - 在泛型类中引用应用程序委托的主要内容,如果未能解决你的问题,请参考以下文章