簡體   English   中英

無法從我的協議類調用委托方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM