溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

iOS開發(fā)那些事-iOS常用設(shè)計模式–委托模式案例實現(xiàn)

發(fā)布時間:2020-08-09 17:30:31 來源:網(wǎng)絡(luò) 閱讀:684 作者:tony關(guān)東升 欄目:移動開發(fā)

書接上回,應(yīng)用案例

我們以UITextFieldDelegate為例來說明一下委托的使用。 UITextFieldDelegate是控件UITextField的 委托,控件的委托主要負責(zé)響應(yīng)控件事件或控制其他對象。除了UITextField,WebView、UITableView等控件也有相應(yīng)的委托對象。

打開UITextFieldDelegate的API文檔,其中有4個有關(guān)編輯的方法,還要3個其它方法。

iOS開發(fā)那些事-iOS常用設(shè)計模式–委托模式案例實現(xiàn)

這里我們在編輯過程中消息的發(fā)送,UITextField編輯過程中與UITextFieldDelegate委托對象之間交互過程。

iOS開發(fā)那些事-iOS常用設(shè)計模式–委托模式案例實現(xiàn)

在 文本框編輯開始前后會發(fā)出消息textFieldShouldBeginEditing:和 textFieldDidBeginEditing:,編輯結(jié)束前后會發(fā)出消息textFieldShouldEndEditing:和 textFieldDidEndEditing:。

為了演示文本框編輯前后發(fā)生了什么,我們需要編寫一個簡單的文本框工程,畫面中只有一個文本框。

iOS開發(fā)那些事-iOS常用設(shè)計模式–委托模式案例實現(xiàn)

我們在視圖控制器ViewController中實現(xiàn)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實現(xiàn)了UITextFieldDelegate協(xié)議,把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分配給文本框?qū)ο?,除了通過代碼我們也可以通過IB工具進行連線分配。打開故事板文件, 右鍵點擊文本框控件,彈出菜單,用鼠標(biāo)拖拽位于Outlets(輸出口)下面的delegate后面的圓圈,到View Controller上松開鼠標(biāo)。

iOS開發(fā)那些事-iOS常用設(shè)計模式–委托模式案例實現(xiàn)

這樣運行代碼,當(dāng)觸摸文本框使其處于編輯狀態(tài)時,在日志中會輸出:

call textFieldShouldBeginEditing:

call textFieldDidBeginEditing:

輸入完成點擊“return”鍵關(guān)閉鍵盤,結(jié)束編輯狀態(tài),日志中輸出:

call textFieldShouldReturn:

call textFieldShouldEndEditing:

call textFieldDidEndEditing:

textFieldShouldReturn:是點擊“return”鍵發(fā)出的消息。我們借助于該消息通過[textField resignFirstResponder]方法關(guān)閉鍵盤。

更 復(fù)雜的控件(如UITableView)除了委托協(xié)議(UITableViewDelegate)還有 數(shù)據(jù)源協(xié)議(UITableViewDataSource)。數(shù)據(jù)源與委托一樣都是委托設(shè)計模式的具應(yīng)用,委托對象主要對控件對象的事件和狀態(tài)變化做出響 應(yīng),而數(shù)據(jù)源對象是為控件對象提供數(shù)據(jù)。需要注意的是委托中的方法在實現(xiàn)時是可選的,而數(shù)據(jù)源中的方法一般必須實現(xiàn)。

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI