ios Objective C委托方法

时间:2015-05-26 16:17:01

标签: ios objective-c sdk appdelegate

这是我目标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)。 实际上说明需要创建这些方法,但我不知道在哪里。

非常感谢任何帮助。 谢谢

3 个答案:

答案 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