2012-04-23 51 views
0

的類我有一個iPhone應用程序中,我有ClassB的方法叫:iPhone SDK - 避免鑄造的委託

-(void)login:(NSString *)url withDelegate:(id)delegate { } 

這種方法是從ClassA調用。我通過在委託參數以回調傳遞給ClassA當這個方法完成:

if(delegate && [delegate respondsToSelector:@selector(parseLogin:)]) { 
    [delegate parseLogin:loginInfoDictionary]; 
} 

不過,我得到一個警告,指出:-Instance method: parseLogin: not found

這並不奇怪,因爲我從來沒有投的參數代表任何特定的類。然而,爲了保持這個方法儘可能的抽象,我想保留代表的數據類型爲id

這是可能嗎?

我運行iOS 5.1(如果它的事項)。如果可能,我想擺脫警告。

非常感謝! 佈雷特

回答

4

來處理這方面的一個常見的方法是創建一個協議並已實施的ClassA的協議。

@protocol ProtocolName 
- (void) parseLogin:(NSDictionary*)dictionary; 
@end 

然後實現協議ClassA的

@interface ClassA : NSObject<ProtocolName> 

然後改變你的方法是這樣的:

-(void)login:(NSString *)url withDelegate:(id<ProtocolName>)delegate { } 

這將擺脫的警告,仍然是可擴展的。

+0

工程就像一個魅力!謝謝! – Brett 2012-04-23 20:32:05

1

如果不同類別想成爲代表,申報ClassB.h的@protocol並有主叫類採納該協議@interface ClassA : UIViewController <ClassBDelegate>

正式和更快一點:如果您知道委託將始終是ClassA的實例嗎? ClassA作爲委託類型而不是id。

更快,只是避免編譯器警告是原樣留下您的代碼,除了調用是這樣的:

if(delegate && [delegate respondsToSelector:@selector(parseLogin:)]) { 
    [delegate performSelector:@selector(parseLogin:) withObject:loginInfoDictionary afterDelay:0.0]; 
} 
1

不能使用的協議?像這樣的協議:

@protocol LoginDelegate <NSObject> 

@optional 
- (void) parseLogin: (NSDictionary*) dict; 

@end 

所以,在你CLASSA您將使用id<LoginDelegate>