addTarget方式和UITextFieldDelegate方式監聽文字框淺析

weixin_34082695發表於2016-02-22

如圖所示:

1370647-dd473a9008931269.png

  • 在開發中,一般都要監聽賬號對應的輸入文字框和密碼對應的文字框同時有值,才能讓登入按鈕可以點選,這個時候就有兩種辦法了,一種是通過UITextFieldDelegate方法監聽,一種是通過addTarget方法監聽,可能大多數人有和筆者相同的疑問,是不是都可以呢?那麼筆者通過實驗來說明情況:

  • 首先通過UITextFieldDelegate方式監聽

    //當賬號與密碼同時有值,登入按鈕才能夠點選
    self.accountTextF.delegate = self;
    self.pwdTextF.delegate = self;

    點選文字框的時候會自動呼叫該方法
    //是否允許改變文字.
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    NSLog(@"accountTextF==%@",self.accountTextF.text);
    NSLog(@"----%@",string);
    if (self.accountTextF.text.length && self.pwdTextF.text.length) {
        self.loginBtn.enabled = YES;
    }else {
        self.loginBtn.enabled = NO;
    }

    return YES;
}

  • 上面筆者把賬號對應的屬性裡面儲存的值self.accountTextF.text,和string的值列印了一下,如圖所示,
1370647-9c97d21ae24dfbd6.png

1370647-8e468653513b6c69.png
  • 細心的讀者可能已經發現了,值不一樣,不同步,self.accountTextF.text的值比string的值慢了一拍,這樣就不行了,為什麼因為如果我通過每個文字框的長度去判斷有沒有值的時候,比如我就在賬號文字框裡面輸入了一個字元a,按道理,我的賬號文字框的長度應該是1,可是剛剛通過列印,發現長度應該是0,那麼在裡面進行一些邏輯業務的判斷是錯誤的,好了,接下來看addTarget方式

  • 通過addTarget方式監聽

[self.accountTextF addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged];
[self.pwdTextF addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged];

//當文字內容改變時呼叫
- (void)textChange
{
     NSLog(@"accountTextF==%@",self.accountTextF.text);
    //當賬號與密碼同時有值,登入按鈕才能夠點選
    self.loginBtn.enabled = self.accountTextF.text.length && self.pwdTextF.text.length;

}

效果圖片:

1370647-9c97d21ae24dfbd6.png

1370647-ef4166a5e6a1583f.png

看到沒有,賬號文字框中輸入一個字元a,控制檯就列印一個字元a,兩者保持同步,所以在裡面進行一些邏輯業務的判斷,沒有問題,所以最終結論是,只能用addTarget方式,不能用UITextFieldDelegate方式,謝謝大家

相關文章