2011-07-12 13 views
1

私の問題は、デリゲートを介してプロトコルメソッド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])

私はこの確信しています私の部分の愚かな間違いですが、それはその方法を認識していない理由は、デリゲートは、プロトコルで結ばれているので、私は、理解していない...

答えて

4

あなたがselector:@selector([self.delegate dataLoading])を書いた方法は、使用して間違った試みである:代わりにselector:@selector(dataLoading)

+0

いやはや!!そうです、私はすでに目標を指定しているので、正しいです!どのような愚かな間違い。 – xil3

1

あなたがinitWithDelegateを呼び出すときselfがまだ定義されている場合、私は知りません。それは...下流

てみ物事をめちゃくちゃにすることができる:あなたは(すなわちSELタイプ)セレクタを渡している

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

右、私たちはあまりにも直接的assignementを行う必要はありませんか? 'delegate = [aDelegate retain];' –

1

を、したがって、あなたはこれを書くために必要があるでしょう:

NSInvocationOperation *operation = 
    [[NSInvocationOperation alloc] 
     initWithTarget:self.delegate 
       selector:@selector(dataLoading) // the name of the selector here 
       object:nil]; 
関連する問題