2017-02-16 2 views
0

Ich habe einen View-Controller mit zwei UITableViewCells und jede Zelle enthält eine UITextField. In meiner Navigationsleiste habe ich eine rechte Leiste namens "Speichern", die deaktiviert ist, es sei denn, beide Textfelder enthalten Text. Der Standardzustand der Schaltfläche zum Speichern ist deaktiviert. Der Übergang von deaktiviert zu aktiviert funktioniert gut, aber die Schaltfläche zu deaktivieren, wenn eines der Textfelder geleert wird, ist schwierig.Ermitteln, ob UITextfield leer ist, nachdem Zeichen nacheinander gelöscht wurden

ich zur Zeit mache wie folgt zusammen:

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 

} 

Was ist das Problem verursacht ist, wenn ein Benutzer geht zurück und löscht jedes Zeichen in das Textfeld eins nach dem anderen, wird textField.text?.isEmpty jedes Mal aufgerufen. Wenn ein letztes Zeichen übrig ist, wird textField.text?.isEmpty vor dem Löschen des letzten Zeichens aufgerufen, so dass es false zurückgibt. textField.text?.isEmpty gibt erst dann True zurück, wenn der Benutzer die Löschschaltfläche noch einmal drückt, obwohl nichts mehr gelöscht werden kann.

Antwort

1

Das passiert, weil Sie overriding die shouldChangeCharactersIn() Methode sind, die aufgerufen wird, bevor das tatsächliche Zeichen hinzugefügt/gelöscht wurde. Deshalb, wenn Sie den Fall der Benutzer das letzte Zeichen zu löschen fangen wollen haben Sie 2 Möglichkeiten:

  1. Sie können die if (textField.text?.isEmpty) mit if (textField.text?.characters.count == 1 && replacementString == "") ersetzen.
  2. Sie können auch Ihre Zeichenfolge vor Ihrer if statement wie folgt aktualisiert:

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

    Danach Sie if (newString.isEmpty) überprüfen können.

+0

Dies macht den Job, außer 'newString' hat keine' text' -Eigenschaft - es ist nur 'newString.isEmpty'. – Brosef

+0

Oh, stimmt. Entschuldige mich für den Fehler! Habe gerade meine Antwort bearbeitet! –

0

Also gibt es zwei Zeichen in der TextField. Der Benutzer trifft den Löschvorgang. sentChangeCharactersIn wird aufgerufen. Nichts hat sich noch geändert und textField.text? .count == 2. Sie geben true zurück und das Zeichen wird gelöscht. Der Benutzer trifft ein zweites Mal auf Löschen. shouldChangeCharactersIn wird erneut aufgerufen. An dieser Stelle wurde das letzte Zeichen noch nicht gelöscht. TextField.text? .count == 1 deshalb textField.text? .isEmpty == false. Es wird nicht wahr sein, bis der Benutzer versucht, den Text erneut zu bearbeiten.

Verwandte Themen