[英]Cant call delegate method from my protocol class
我在一堂課中有一個協議:
@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];
沒啥事兒。 我不了解實現的問題-這是一個簡單的適配器模式實現。 因此,我需要使用將調用第三類方法的委托。 有什么幫助嗎?
您沒有設置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];
}
希望有幫助!
在您的情況下,您忘記設置協議委托,還需要調用協議方法
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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.