UITextFieldDelegate

在實際情況中我們有時候在界面輸入時候需要讓用戶輸入的數據與模型同步,那么可能我們就需要監聽UITextField值改變事件,然后在響應的方法中將新的值同步到模型中。這次我們主要提出三種方案,其中第一種方案是不一定有效的,后兩種方案則是比較可靠的方案。


一、實現UITextFieldDelegate協議。

這種方式實際上是由系統空間回調協議中的方式,并且通過查閱文檔我們可以發現有以下相關接口是相關的。

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField

- (void)textFieldDidBeginEditing:(UITextField *)textField

- (BOOL)textFieldShouldEndEditing:(UITextField *)textField

- (void)textFieldDidEndEditing:(UITextField *)textField

代碼如下:

- (void)textFieldDidEndEditing:(UITextField *)textField

{

self.model.text = textField.text;

}


然后實踐中我嘗試了實現textFieldDidEndEditing:方法,發現在輸入框獲取焦點,然后輸入結束,失去焦點后這個過程是正常的。但是問題就出在第三步,如果輸入框一直沒失去焦點(放棄第一響應者),那么這個方法將不會調用,也就是說沒法更新模型了。所以說這種方案是不一定有效的。


二、注冊NSNotificationCenter進行監聽。

親測這種方案是可行的。通知中心是一種一對多的模型,觀察者通過向通知中心注冊某個事件,然后當某個事件發生時,觀察者就可以收到通知中心發來的該事件的通知,然后調用指定的方法進行事件處理。并且剛好通知中心就有針對于UITextField值改變的監聽事件,所以我們只需要實現事件注冊和事件處理的方法就好了。PS:注冊的通知事件記得要移除!!!

(1)注冊通知事件。

//這里的object傳如的是對應的textField對象,方便在事件處理函數中獲取該對象進行操作。

[[NSNotificationCenter defaultCenter] addObserver:self

selector:@selector(textFieldDidChangeValue:)

name:UITextFieldTextDidChangeNotification

object:_textFiled];

(2)實現監聽處理事件。

//這里可以通過發送object消息獲取注冊時指定的UITextField對象

- (void)textFieldDidChangeValue:(NSNotification *)notification

{

UITextField *sender = (UITextField *)[notification object];

self.model.text = sender.text;

}

(3)別忘了移除注冊的通知。

//一般是在dealloc中實現

[[NSNotificationCenter defaultCenter] removeObserver:self];


三、目標-動作機制。

大家應該都清楚繼承自UIControl類的組件都具有動作-目標機制的特性,常見的比如說UIButton,UISwitch,UISlide,UIPageControl這些類型的組件也都有這個特性。感覺這個比通知中心要更來得靈活一點,比如多個UITextField可以響應多個SEL,或者也可以設置為響應同一個SEL,然后只要在SEL判斷一下消息發送者是誰就好了。

[_textView addTarget:self

action:@selector(textFieldDidChangeValue:)

forControlEvents:UIControlEventEditingChanged];

- (void)textFieldDidChangeValue:(id)sender

{

self.model.text = ((UITextField *)sender).text;

}


總結

以上上種方式我個人大部分時間是偏向于使用第三種方案的,即目標-動作機制。通知中心的方法畢竟相當于是多了一個中間層,而且其還要手動注冊和移除相對來說麻煩一點點而已。但是實際情況還得實際分析吧,如果有大批量的UITextField需要更新,并且其指向同一個響應SEL時使用通知中心也是不錯的選擇。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 1、設置UILabel行間距 NSMutableAttributedString*attrString=[[NSM...
    iOS祎閱讀 2,190評論 0 0
  • 轉至元數據結尾創建: 董瀟偉,最新修改于: 十二月 23, 2016 轉至元數據起始第一章:isa和Class一....
    40c0490e5268閱讀 1,757評論 0 9
  • 【2017年最新】? iOS面試題及答案 設計模式是什么? 你知道哪些設計模式,并簡要敘述? 設計模式是一種編碼經...
    紫色冰雨閱讀 621評論 0 1
  • 3:通知傳值 通知中心 NSNotificationCenter提供了一種更加解耦的方式。最典型的應用就是任何對象...
    迷失的昨天閱讀 221評論 0 0
  • Socket編程 文檔來源 http://www.mamicode.com/info-detail-877996....
    aa瘋子aa閱讀 166評論 0 0