Метод протокола не распознается при вызове через делегата - PullRequest
1 голос
/ 12 июля 2011

Моя проблема в том, что, когда я вызываю метод протокола dataLoading через делегата, он просто не распознает его - выдает ошибку expected identifier.

Вот файл протокола / интерфейса:

#import <Foundation/Foundation.h>

@class LoaderView;

@protocol DataLoaderProtocol <NSObject>

@required
- (void) dataLoading;
- (void) doneLoading;

@end

@interface DataLoader : NSObject {

}

@property (retain) id <DataLoaderProtocol> delegate;
@property (retain, nonatomic) LoaderView *loader;

- (id) initWithDelegate: (id <DataLoaderProtocol>) delegate;
- (void) start;

@end

А вот файл реализации:

#import "DataLoader.h"
#import "LoaderView.h"


@implementation DataLoader

@synthesize delegate = _delegate;
@synthesize loader = _loader;

- (id) initWithDelegate: (id <DataLoaderProtocol>) delegate
{
    self.delegate = delegate;

    return self;
}

- (void) start
{
    NSOperationQueue *queue = [NSOperationQueue new];
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] 
                                        initWithTarget:self.delegate
                                        selector:@selector([self.delegate dataLoading]) 
                                        object:nil];
    [queue addOperation:operation]; 
    [operation release];
}

@end

Ошибка в этой строке: selector:@selector([self.delegate dataLoading])

Я уверен, что это глупая ошибкасо своей стороны, но я не понимаю, почему он не распознает этот метод, поскольку делегат связан с протоколом ...

Ответы [ 3 ]

4 голосов
/ 12 июля 2011

То, как вы написали selector:@selector([self.delegate dataLoading]) неверно, попробуйте использовать: selector:@selector(dataLoading) вместо.

1 голос
/ 12 июля 2011

Вы передаете селектор (т. Е. SEL тип), поэтому вам нужно будет написать это:

NSInvocationOperation *operation = 
    [[NSInvocationOperation alloc] 
        initWithTarget:self.delegate
              selector:@selector(dataLoading) // the name of the selector here 
                object:nil];
1 голос
/ 12 июля 2011

Я не знаю, определено ли self, когда вы звоните initWithDelegate.Это может испортить вещи вниз по течению ...

Попробуйте:

- (id) initWithDelegate: (id <DataLoaderProtocol>) delegate {
    self = [super init];
    if(self) {
        self.delegate = delegate
    }
    return self;
}
...