这是我目标C的第一天,所以我为缺乏知识而道歉。
我需要将现有的SKD导入到应用程序中并成功完成。现在我需要创建委托方法,我不明白我该怎么做。
这是SDK(SDKManager.h)中包含的头文件的结构:
'Log'=> 'Illuminate\Support\Facades\Log',
所以,从我的FirstViewController.m我可以导入标题并调用两个方法:
@protocol SDKManagerDelegate;
@interface SDKManager : NSObject
@property (nonatomic, weak) id<SDKDelegate> delegate;
+(void)initialize:(NSString*)appId withKEY:(NSString*)key;
+(void)setHandler:(id)delegate;
@end
@protocol SDKManagerDelegate <NSObject>
@required
-(void)appDidReceiveTokens:(NSDictionary*)items withResponse:(NSDictionary*)response;
@end
但我注意到我无法调用其他方法(即appDidReceiveTokens)。 实际上说明需要创建这些方法,但我不知道在哪里。
非常感谢任何帮助。 谢谢
答案 0 :(得分:1)
您不直接在要实现委托方法的文件中调用委托方法。查看Apples documentation on the concept of Delegation。
要正确实现此功能,您需要在类中使用委托,然后实现@required
和/或@optional
的委托方法。
答案 1 :(得分:1)
您已正确创建委托协议和存储SDKManager
委托的属性。
您的setHandler:
和initialize:withKEY:
方法是类方法,而delegate
属性属于{{1}的每个实例 }}。如果没有看到SDKManager
的实施文件(.m),就很难知道为什么要这样设置它。您可能正在尝试遵循单一模式 - 如果是这样,请阅读它,例如here
答案 2 :(得分:1)
原因是你有类方法设置调用setHandler方法,委托是属性,那么你在哪里分配委托以及何时以及如何调用委托。我希望你能理解一个类和实例是什么。因此,在创建对象的实例之前,不能调用委托。
你有两个不同的类方法,用于为类设置一些属性,将它们作为属性是否有意义。
更通用,更好的方法就是这样,
@protocol SDKManagerDelegate <NSObject>
@required
-(void)appDidReceiveTokens:(NSDictionary*)items
withResponse:(NSDictionary*)response;
@end
@protocol SDKManagerDelegate;
@interface SDKManager : NSObject
- (instancetype)initWithAppId:(NSString *)appId
key:(NSString *)key
delegate:(id<SDKManagerDelegate>)delegate;
@end
@interface SDKManager ()
@property (nonatomic, copy, readonly) NSString *appId;
@property (nonatomic, copy, readonly) NSString *key;
@property (nonatomic, weak, readonly) id<SDKManagerDelegate> delegate;
@end
@implementation SDKManager
- (instancetype)initWithAppId:(NSString *)appId
key:(NSString *)key
delegate:(id<SDKManagerDelegate>)delegate
{
if (self = [super init]) {
_appId = [appId copy];
_key = [key copy];
_delegate = delegate;
}
return self;
}
- (void)doSomeNetworkRequestHere
{
[self fetchTokenFromServer:^(NSDictionary *tokens, NSDictionary *response){
[self.delegate appDidReceiveTokens:tokens
withResponse:response];
}];
}
- (void)fetchTokenFromServer:(void(^)(NSDictionary *tokens, NSDictionary *response))completion
{
}
@end