iOS開發那些事-iOS經常使用設計模式–委託模式案例實現

書接上回,應用案例ios

咱們以UITextFieldDelegate爲例來講明一下委託的使用。 UITextFieldDelegate是控件UITextField的 委託,控件的委託主要負責響應控件事件或控制其餘對象。除了UITextField,WebView、UITableView等控件也有相應的委託對象。設計模式

打開UITextFieldDelegate的API文檔,其中有4個有關編輯的方法,還要3個其它方法。ide

61

這裏咱們在編輯過程當中消息的發送,UITextField編輯過程當中與UITextFieldDelegate委託對象之間交互過程。工具

71

在 文本框編輯開始先後會發出消息textFieldShouldBeginEditing:和 textFieldDidBeginEditing:,編輯結束先後會發出消息textFieldShouldEndEditing:和 textFieldDidEndEditing:。atom

爲了演示文本框編輯先後發生了什麼,咱們須要編寫一個簡單的文本框工程,畫面中只有一個文本框。spa

81

咱們在視圖控制器ViewController中實現UITextFieldDelegate,ViewController是UITextField的委託對象。ViewController.h代碼以下:設計

 

  
  
  
  
  1. #import <UIKit/UIKit.h> 
  2.  
  3. @interface ViewController : UIViewController<UITextFieldDelegate> 
  4.  
  5. @property (weak, nonatomic) IBOutlet UITextField *textField; 
  6.  
  7. @end 

h文件中ViewController實現了UITextFieldDelegate協議,把UITextField 定義爲一個弱引用的「輸出口」(「輸出口」概念咱們將在UIView與控件一章詳細介紹)。日誌

ViewController.m代碼以下:對象

 

  
  
  
  
  1. @implementation ViewController 
  2.  
  3. - (void)viewDidLoad 
  4.  
  5.  
  6.     [super viewDidLoad]; 
  7.  
  8.     self.textField.delegate = self; 
  9.  
  10.  
  11. #pragma mark — UITextFieldDelegate method 
  12.  
  13. - (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
  14.  
  15.  
  16.     NSLog(@」call textFieldShouldBeginEditing:」); 
  17.  
  18.     return YES; 
  19.  
  20.  
  21. - (void)textFieldDidBeginEditing:(UITextField *)textField 
  22.  
  23.  
  24.     NSLog(@」call textFieldDidBeginEditing:」); 
  25.  
  26.  
  27. - (BOOL)textFieldShouldEndEditing:(UITextField *)textField 
  28.  
  29.  
  30.     NSLog(@」call textFieldShouldEndEditing:」); 
  31.  
  32.     return YES; 
  33.  
  34.  
  35. - (void)textFieldDidEndEditing:(UITextField *)textField 
  36.  
  37.  
  38.     NSLog(@」call textFieldDidEndEditing:」); 
  39.  
  40.  
  41. - (BOOL)textFieldShouldReturn:(UITextField *)textField 
  42.  
  43.  
  44.     NSLog(@」call textFieldShouldReturn:」); 
  45.  
  46.     [textField resignFirstResponder]; 
  47.  
  48.     return YES; 
  49.  
  50.  
  51. @end 

在 m文件中viewDidLoad 方法self.textField.delegate = self語句極爲重要,它將委託對象ViewController分配給文本框對象,除了經過代碼咱們也能夠經過IB工具進行連線分配。打開故事板文件, 右鍵點擊文本框控件,彈出菜單,用鼠標拖拽位於Outlets(輸出口)下面的delegate後面的圓圈,到View Controller上鬆開鼠標。事件

91

這樣運行代碼,當觸摸文本框使其處於編輯狀態時,在日誌中會輸出:

call textFieldShouldBeginEditing:

call textFieldDidBeginEditing:

輸入完成點擊「return」鍵關閉鍵盤,結束編輯狀態,日誌中輸出:

call textFieldShouldReturn:

call textFieldShouldEndEditing:

call textFieldDidEndEditing:

textFieldShouldReturn:是點擊「return」鍵發出的消息。咱們藉助於該消息經過[textField resignFirstResponder]方法關閉鍵盤。

更 複雜的控件(如UITableView)除了委託協議(UITableViewDelegate)還有 數據源協議(UITableViewDataSource)。數據源與委託同樣都是委託設計模式的具應用,委託對象主要對控件對象的事件和狀態變化作出響 應,而數據源對象是爲控件對象提供數據。須要注意的是委託中的方法在實現時是可選的,而數據源中的方法通常必須實現。

相關文章
相關標籤/搜索