先舉一個例子:
假如"我"的本職工作之一是“接電話”,但"我"發現太忙了或來電太雜了,於是我聘請一位"秘書"分擔我“接電話”的工作,如果電話是老板打來的,就讓“秘書”將電話轉接給“我”。。。
那麼,“我”就是A Object. “秘書”就是"我"的“Delegate”。寫成代碼就是 -- [我 setDelegate:秘書];
delegate的概念出現與mvc(model-view-controller),protocol,單線繼承 密切相關
The main value of delegation is that it allows you to easily customize the behavior of several objects in one central object.
Cocoa 中處理事件的方式有幾種,其中一種是你可以重載類中的對應的事件處理方 法,比如MouseDown事件在NSResponse類中就被方法mouseDown:處理,所以所有繼承自NSResponse的類都可以重載 mouseDown:方法來實現對MouseDown事件的處理。
另外一種處理方式就是使用Delegate,當一個對象接受到某個事件 或者通知的時候, 會向它的Delegate對象查詢它是否能夠響應這個事件或者通知,如果可以這個對象就會給它的Delegate對象發送一個消息(執行一個方法調用)
協議 Protocol :
我說下我的理解。object-c 裡沒有多繼承。那麼又要避免做出一個對象什麼都會(super class monster,huge ,super,waste)一個超能對象 本身是否定了面向對象的概念和真谛了。為了讓代碼更簡潔,條理更清楚,可以將部分職責分離。
協議本身沒有具體的實現。只規定了一些可以被其它類實現的接口。
@protocal UITextFieldDelegate
-(BOOL) textFieldShouldReturn:(UITextField *) textField ;
@end
delegate 總是被定義為 assign @property
@interface UITextField
@property (assign) id<UITextFieldDelegate> delegate;
@end
(#add,到此,如果還看不出橋模式的基本是不懂C++的,"委托"這個詞我覺得被濫用了,包含一個類成員變量然後利用它去調用其成員函數,豈不是太普通不過了,除了基本類型變量,類包含另一個類的對象或指針簡直就是家常便飯,而橋模式以此基礎上提升了一個層次,看似平常,其實偉大)
這樣我們就在UITextField內部聲明一個委托(delegate),那麼就需要委托的代理實現UITextFieldDelegate 中約定的行為
// 首先, 在接口裡邊聲明要使用誰的Delegate
@interface delegateSampleViewController : UIViewController <UITextFieldDelegate>
{}
@end
// 然後在實現文件中初始化的時候, 設置Delegate為self(自己)
@implementation delegateSampleViewController
// ....
UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 300, 400)];
textField.delegate = self;//設置當前的控制器為UITextField的代理,相當於注冊(指定)代理人
[textField becomeFirstResponder];
[cell.contentView addSubview:textField];
[textField release];
// ....
}
// 實現UITextFieldDelegate中約定的行為
#pragma mark UITextFieldDelegate Method
// called when 'return' key pressed. return NO to ignore.
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}