如何理解 Objective-C Delegate

例如,咱們要在一個 ViewController 中使用一個ActionSheet,代碼以下:this

UIActionSheet *actionSheet = [[UIActionSheet alloc]
          initWithTitle:@"Delegate Example"
          delegate:self // telling this class to implement UIActionSheetDelegate
          cancelButtonTitle:@"Cancel"
          destructiveButtonTitle:@"Destructive Button"
          otherButtonTitles:@"Other Button",nil

  [actionSheet showInView:self.view];

中間的代碼: delegate:self 來告訴當前這個ViewController 來實現 UIActionSheetDelegate
這樣作的緣由是
ViewController 和 ActionSheet 兩者是相互獨立的,可是當用戶點擊了 ActionSheet 上的按鈕時,ViewController 須要處理 ActionSheet 上按鈕的點擊事件,這樣作至關於通知 ViewController 監聽 UIActionSheetDelegate,以便咱們處理 ActionSheet 上按鈕的點擊事件。atom

注意:
delegte:self; 這行代碼僅是告訴 ViewController 實現 UIActionSheetDelegate,可是咱們還須要告訴類實現 UIActionSheetDelegate protocol (協議),方法是在 .h 文件中 加入,以下所示:代理

@interface DelegateExampleViewController : UIViewController <UIActionSheetDelegate>
  • 咱們本身建立的類 (CustomClass),如何使用 delegate

在CustomClass.h 文件中 首先要爲這個 delegate 定義 protocol (寫在 @interface 以前)
在 protocol 和 end 之間定義 protocol 方法, 這個方法能夠被任何使用這個代理的類所使用code

#import 
@class CustomClass;

//爲Delegate 定義 protocol
@protocol CustomClassDelegate 
//定義 protocol 方法
-(void)sayHello:(CustomClass *)customClass;
@end

@interface CustomClass : NSObject {

}

// define delegate property
@property (nonatomic, assign) id  delegate;

// define public functions
-(void)helloDelegate;

@end

.m 文件中沒什麼特別的,最重要的要實現 helloDelegate 方法事件

-(void)helloDelegate {
    // send message the message to the delegate!
    [delegate sayHello:self];
}

接下來咱們切換到要使用這個類的 ViewController ,實現上面剛剛建立的 delegateit

// DelegateExampleViewController.h
// import our custom class

#import "CustomClass.h"

@interface DelegateExampleViewController : UIViewController <CustomClassDelegate> {

}
@end

在 DelegateExampleViewController.m 文件中,咱們須要初始化這個 custom Class,而後讓 delegate 給咱們傳遞一條消息io

//DelegateExampleViewController.m

CustomClass *custom = [[CustomClass alloc] init];

// assign delegate
custom.delegate = self;
[custom helloDelegate];

仍是在 DelegateExampleViewController.m 咱們要實如今 custom Class.h 中生命的 delegate functionfunction

-(void)sayHello:(CustomClass *)customClass {
    NSLog(@"Hi!");
}

Bingo!class

相關文章
相關標籤/搜索