我在一个班级中有一个协议:
@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];
什么都没发生。我不明白实现有什么问题 - 这是一个简单的适配器模式实现。所以我需要使用委托来调用第三类中的方法。有什么帮助吗?
答案 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....
我只是提出了如何创建协议
的基本想法#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);
}