2013-09-05 3 views
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]; 

Ничего не произошло. Я не понимаю, что случилось с реализацией - это простая реализация шаблона адаптера. Поэтому мне нужно использовать делегат, который вызовет методы из третьего класса. Любая помощь?

ответ

2

Вы не задали позицию delegate. Вы должны сделать это,

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

Кроме того, в DataManager классе удалить объявление Ивар, только декларирует собственность достаточна, Ивар получает автоматически создается. Вызовите метод делегата, как указано ниже,

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

Надеюсь, что это поможет!

+0

сейчас есть ошибка _Property 'delegate' не найден на объекте типа 'DataPlistManager *' _ Что случилось сейчас? – ShurupuS

+0

@ShurupuS Вы действительно хотите передать экземпляр 'DataPlistManager' в' initWithDataPlistManager: 'или должен ли он вместо экземпляра DataManager? – Amar

+0

Что такое класс DataPlistManager? Должен ли он быть подклассом класса DataManager? – Amar

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

} 
Смежные вопросы