无法从我的协议类调用委托方法

时间:2013-09-05 12:51:53

标签: ios objective-c adapter delegation

我在一个班级中有一个协议:

@protocol DataStorageManager

- (void) saveFile;

@end

@interface DataManager : NSObject
{
    id <DataStorageManager> delegate;
}

@property (nonatomic, assign) id<DataStorageManager> delegate;

//methods

@end

及其实施:

@implementation DataManager

@synthesize delegate;

@end

我有另一个类,它是第一个和第三个之间的适配器:

#import "DataManager.h"
#import "DataPlistManager.h"

@interface DataAdapter : NSObject <DataStorageManager>

@property (nonatomic,strong) DataPlistManager *plistManager;
- (void) saveFile;

@end

及其实施

#import "DataAdapter.h"

@implementation DataAdapter

-(id) initWithDataPlistManager:(DataPlistManager *) manager
{
    self = [super init];
    self.plistManager = manager;
    return self;
}

- (void) saveFile
{
    [self.plistManager savePlist];
}

@end

所以,当我在第一个方法中尝试像这样调用我的委托方法时

[delegate saveFile]; 

什么都没发生。我不明白实现有什么问题 - 这是一个简单的适配器模式实现。所以我需要使用委托来调用第三类中的方法。有什么帮助吗?

2 个答案:

答案 0 :(得分:2)

您没有设置delegate属性。你需要这样做,

-(id) initWithDataPlistManager:(DataPlistManager *) manager
{
    self = [super init];
    self.plistManager = manager;
    self.plistManager.delegate = self;
    return self;
}

此外,在DataManager类中删除ivar声明,只需声明属性就足够了,就会自动创建ivar。调用委托方法如下,

if([self.delegate respondsToSelector:@selector(saveFile)] {
    [self.delegate saveFile]; 
}

希望有所帮助!

答案 1 :(得分:1)

在您的情况下,您忘记设置协议委托,还需要调用协议方法
self.delegate....

我只是提出了如何创建协议

的基本想法

Also Read This Question

#DetailViewController.h

#import <UIKit/UIKit.h>

@protocol MasterDelegate <NSObject>
-(void) getButtonTitile:(NSString *)btnTitle;
@end


@interface DetailViewController : MasterViewController

@property (nonatomic, assign) id<MasterDelegate> customDelegate; 

#DetailViewController.m

if([self.customDelegate respondsToSelector:@selector(getButtonTitile:)])
{
          [self.customDelegate getButtonTitile:button.currentTitle];    
}

#MasterViewController.m

create obj of DetailViewController

DetailViewController *obj = [[DetailViewController alloc] init];
obj.customDelegate = self;
[self.navigationController pushViewController:reportTypeVC animated:YES];

and add delegate method in MasterViewController.m for get button title.

#pragma mark -
#pragma mark - Custom Delegate  Method

-(void) getButtonTitile:(NSString *)btnTitle;
{
    NSLog(@"%@", btnTitle);

}