書接上回,應用案例
我們以UITextFieldDelegate為例來說明一下委託的使用。 UITextFieldDelegate是控制項UITextField的 委託,控制項的委託主要負責響應控制項事件或控制其他對象。除了UITextField,WebView、UITableView等控制項也有相應的委派物件。
開啟UITextFieldDelegate的API文檔,其中有4個有關編輯的方法,還要3個其它方法。
這裡我們在編輯過程中訊息的發送,UITextField編輯過程中與UITextFieldDelegate委派物件之間互動過程。
在 文字框編輯開始前後會發出訊息textFieldShouldBeginEditing:和 textFieldDidBeginEditing:,編輯結束前後會發出訊息textFieldShouldEndEditing:和 textFieldDidEndEditing:。
為了示範文字框編輯前後發生了什麼,我們需要編寫一個簡單的文字框工程,畫面中只有一個文字框。
我們在視圖控制器ViewController中實現UITextFieldDelegate,ViewController是UITextField的委派物件。ViewController.h代碼如下:
#import <UIKit/UIKit.h>@interface ViewController : UIViewController<UITextFieldDelegate>@property (weak, nonatomic) IBOutlet UITextField *textField;@end
h檔案中ViewController實現了UITextFieldDelegate協議,把UITextField 定義為一個弱引用的“輸出口”(“輸出口”概念我們將在UIView與控制項一章詳細介紹)。
ViewController.m代碼如下:
@implementation ViewController- (void)viewDidLoad{ [super viewDidLoad]; self.textField.delegate = self;}#pragma mark — UITextFieldDelegate method- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{ NSLog(@”call textFieldShouldBeginEditing:”); return YES;}- (void)textFieldDidBeginEditing:(UITextField *)textField{ NSLog(@”call textFieldDidBeginEditing:”);}- (BOOL)textFieldShouldEndEditing:(UITextField *)textField{ NSLog(@”call textFieldShouldEndEditing:”); return YES;}- (void)textFieldDidEndEditing:(UITextField *)textField{ NSLog(@”call textFieldDidEndEditing:”);}- (BOOL)textFieldShouldReturn:(UITextField *)textField{ NSLog(@”call textFieldShouldReturn:”); [textField resignFirstResponder]; return YES;}@end
在 m檔案中viewDidLoad 方法self.textField.delegate = self語句極為重要,它將委派物件ViewController分配給文字框對象,除了通過代碼我們也可以通過IB工具進行連線分配。開啟故事板檔案, 右鍵點擊文字框控制項,快顯功能表,用滑鼠拖拽位於Outlets(輸出口)下面的delegate後面的圓圈,到View Controller上鬆開滑鼠。
這樣運行代碼,當觸摸文字框使其處於編輯狀態時,在日誌中會輸出:
call textFieldShouldBeginEditing:
call textFieldDidBeginEditing:
輸入完成點擊“return”鍵關閉鍵盤,結束編輯狀態,日誌中輸出:
call textFieldShouldReturn:
call textFieldShouldEndEditing:
call textFieldDidEndEditing:
textFieldShouldReturn:是點擊“return”鍵發出的訊息。我們藉助於該訊息通過[textField resignFirstResponder]方法關閉鍵盤。
更 複雜的控制項(如UITableView)除了委託協議(UITableViewDelegate)還有 資料來源協議(UITableViewDataSource)。資料來源與委託一樣都是委託設計模式的具應用,委派物件主要對控制項對象的事件和狀態變化做出響 應,而資料來源對象是為控制項對象提供資料。需要注意的是委託中的方法在實現時是可選的,而資料來源中的方法一般必須實現。