2017-02-16 69 views
0

我有一個視圖控制器與兩個UITableViewCells和每個單元格包含UITextField。在我的導航欄中,我有一個名爲「保存」的右側欄按鈕,除非兩個文本框都包含文本,否則該按鈕將被禁用。保存按鈕的默認狀態被禁用。從禁用到啓用的轉換工作正常,但在其中一個文本框被清空時禁用按鈕很困難。確定UITextfield是否爲空後逐個刪除字符

我目前做如下表現:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool { 

    if title == "Password"{ 
     if textField.tag == 1{ 
      if (textField.text?.isEmpty)!{ 
       passwordField1Empty = true 
      } 
      else { 
       passwordField1Empty = false 
      } 
     } 
     else if textField.tag == 2 { 
      if (textField.text?.isEmpty)! { 
       passwordField2Empty = true 
      } 
      else { 
       passwordField2Empty = false 
      } 
     } 

     if passwordField1Empty == false && passwordField2Empty == false { 
      self.navigationItem.rightBarButtonItem?.isEnabled = true 
     } 
     else { 
      self.navigationItem.rightBarButtonItem?.isEnabled = false 
     } 
    } 
    else { 
     self.navigationItem.rightBarButtonItem?.isEnabled = true 
    } 
    return true 

} 

請告訴我造成的問題是,如果用戶可以追溯到並刪除一個在文本字段一個每個字符,textField.text?.isEmpty將被調用每次。當剩下最後一個字符時,textField.text?.isEmpty將在刪除最後一個字符前被調用,所以它最終返回false。 textField.text?.isEmpty將不會返回true,除非用戶再次按下刪除按鈕,即使沒有剩下要刪除的東西。

回答

1

發生這種情況的原因是你在overridingshouldChangeCharactersIn()方法,該方法在實際字符被添加/刪除之前被調用。因此,如果你想趕上用戶刪除最後一個字符的情況下,你有兩個選擇:

  1. ,可隨時更換if (textField.text?.isEmpty)if (textField.text?.characters.count == 1 && replacementString == "")
  2. 您還可以將if statement像在此之前更新您的字符串:

    let newString = NSString(string: textField.text!).replacingCharacters(in: range, with: string) 
    

    這個你可以檢查if (newString.isEmpty)後。

+0

除了'newString'沒有'text'屬性 - 它只是'newString.isEmpty'這個工作。 – Brosef

+0

哦,沒錯。對不起,錯誤!剛編輯我的答案! –

0

所以在textField中有兩個字符。用戶點擊刪除。 shouldChangeCharactersIn被調用。沒有任何改變,textField.text?.count == 2.你返回true並且該字符被刪除。用戶再次點擊刪除。 shouldChangeCharactersIn再次被調用。此時最後一個字符還沒有被刪除,但textField.text?.count == 1這就是爲什麼textField.text?.isEmpty == false。在用戶嘗試再次編輯文本之前它不會是真實的。

相關問題