2011-08-24 60 views
0

任何人都可以在iphone sdk中用實時場景解釋DELEGATE定義。iPhone SDK中的委託定義

對不起,我這裏可憐的問題。

在此先感謝。

+0

看看[我的答案在這裏](http://stackoverflow.com/questions/7118598/what-is-the-difference-between-notifications-delegates-and-protocols/7118796#7118796)... – jtbandes

回答

0

簡而言之:委託是兩個對象之間的一對一關係,允許在另一個對象上調用方法,並且它允許被調用者執行該方法的自定義實現。

委託可以讓你編寫自定義器件定製的方法實現。

例如UITableView's Delegatedatasource(這是作爲代表技術上相同)允許的UITableView讓其它類重要的任務,如建立細胞在的tableview顯示的和對事件作出響應(例如輕敲在tableview中的細胞)。

首先使用代表團,你需要定義一個協議:在類的頭文件的前面「<>」

@protocol protocolNameHere 

- (void) sampleMethodHere; 

@optional 

- (void) implementingThisMethodIsOptional; 

@end 

那麼你要添加的協議的名稱,你想成爲代表。該班現在符合該協議。你需要在這個類中實現這個方法。

如果有多個代表,則用逗號分隔它們。

3

委託是將在未來的某個點響應預先選擇的選擇器(函數調用)的對象。

假設我使用類FancyAsynchronousURLGetter的對象異步加載一個URL(在後臺)。由於它在後臺運行,因此我希望能夠在加載url時執行其他操作,然後在準備就緒時收到通知。通過在FancyAsynchronousURLGetter上使用委託並編寫適當的代碼,我可以指定一個具有特定選擇器的對象,該選擇器將在FancyAsynchronousURLGetter完成時調用。事情是這樣的:

- (void)loadView 
{ 
    ... 
    FancyAsynchronousURLGetter* getter = [[FancyAsynchronousURLGetter alloc] initWithURL:url]; 
    [getter setDelegate:self]; 
    /* 
    getter will call either 
     - (void)fancyAsynchronousURLGetterLoadSucceeded:(FancyAsynchronousURLGetter*)g 
    or 
     - (void)fancyAsynchronousURLGetterLoadFailed:(FancyAsynchronousURLGetter*)g 
    on its delegate, depending on whether load succeeded or failed 
    */ 
    [getter start]; 
    ... 
} 

- (void)fancyAsynchronousURLGetterLoadSucceeded:(FancyAsynchronousURLGetter*)g 
{ 
    NSLog(@"Load succeeded."); 
} 


- (void)fancyAsynchronousURLGetterLoadFailed:(FancyAsynchronousURLGetter*)g 
{ 
    NSLog(@"Load failed."); 
} 

,並在FancyAsynchronousURLGetter本身:

- (void)start 
{ 
    [self performSelectorInBackground:@selector(fetchURL) withObject:nil]; 
} 

- (void))fetchURL 
{ 
    Fetch the URL synchronously 
    if (success) 
     [delegate fancyAsynchronousURLGetterLoadSucceeded:self]; // note: probably want to call this on the main thread 
    else 
     [delegate fancyAsynchronousURLGetterLoadFailed:self]; 
} 
+0

我會用(方法調用)替換(函數調用)。方法調用與直接調用函數不同。而你使用的方法名稱是不可能的。使其成爲一個委託方法,稱爲'fancyAsynchronousURLGetter:(id)sender succeeded:(BOOL)success'。 –

+0

謝謝 - 更正(3年後!) – damian

2

這裏是一個示例代碼來了解。

協議定義

#import <Foundation/Foundation.h> 

    @protocol ProcessDataDelegate <NSObject> 
    @required 
    - (void) processSuccessful: (BOOL)success; 
    @end 

    @interface ClassWithProtocol : NSObject 
    { 
     id <ProcessDataDelegate> delegate; 
    } 

    @property (retain) id delegate; 

    -(void)startSomeProcess; 

    @end 

協議執行

#import "ClassWithProtocol.h" 

    @implementation ClassWithProtocol 
    @synthesize delegate; 

    - (void)processComplete 
    { 
     [[self delegate] processSuccessful:YES]; 
    } 

    -(void)startSomeProcess 
    { 
     [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector: @selector(processComplete) userInfo:nil repeats:YES]; 
    } 

@end

要得到充分的思想,visit here...

0

代表不依賴於您使用的語言或平臺,它是一種設計模式。我建議你閱讀Delegation pattern瞭解基本知識。之後,我認爲你可以搜索更深入的瞭解。