2

我在一类中有一个协议:

@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]; 

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

4

2 回答 2

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]; 
}

希望有帮助!

于 2013-09-05T12:55:21.713 回答
1

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

我只是给出了如何创建协议的基本思路

另请阅读此问题

#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);

}
于 2013-09-05T12:54:21.200 回答