2015-06-18 10 views
17

Ich habe 4 Textfelder auf einem Register Bildschirm und ich habe es eingerichtet, so dass, wenn der Benutzer als nächstes auf jedem Textfeld drückt, das nächste Textfeld ist fokussiert. Code unten:Fokussieren eines Textfelds in swift

func textFieldShouldReturn(textField: UITextField) -> Bool { 
     if (textField == self.fNameField) { 
      textField.resignFirstResponder() 
      self.sNameField.becomeFirstResponder() 
     } 
     else if (textField == self.sNameField) { 
      self.emailField.becomeFirstResponder() 

     } else if (textField == self.emailField) { 
      self.passwordField.becomeFirstResponder() 
     } 
     else{ 
      var thereWereErrors = checkForErrors() 
      if !thereWereErrors 
      { 
       //conditionally segue to next screen 
      } 
     } 

     return true 
    } 

Nach der Rückkehr des endgültigen Textfelds, rufe ich eine Überprüfung auf Fehler (unten). Wenn ein Problem mit irgendeinem Feld besteht, möchte ich dieses Textfeld so fokussieren, dass der Benutzer es leicht korrigieren kann. Was passiert, ist, dass das Textfeld mit dem Fehler für eine Sekunde fokussiert wird (wie von den checkForErrors-Funktionen angewiesen), aber dann wird wieder auf das Passwort-Textfeld umgeschaltet. Ich habe auch versucht, self.passwordField.resignFirstResponder() in die letzte andere der oben genannten Funktion hinzuzufügen, und das Passwortfeld verliert den Fokus, aber dann das Textfeld mit dem aufgetretenen Problem ist überhaupt nicht Fokus (nicht einmal für eine Sekunde wie zuvor) Wie kann ich beheben Dies?

func checkForErrors() -> Bool 
    { 
     var errors = false 
     let title = "Error" 
     var message = "" 
     if fNameField.text.isEmpty { 
      errors = true 
      message += "First name empty" 
      alertWithTitle(title, message: message, ViewController: self) 
      self.fNameField.becomeFirstResponder() 
     } 
     else if sNameField.text.isEmpty 
     { 
      errors = true 
      message += "Surname empty" 
      alertWithTitle(title, message: message, ViewController: self) 
      self.sNameField.becomeFirstResponder() 
     } 
     else if emailField.text.isEmpty 
     { 
      errors = true 
      message += "Email empty" 
      alertWithTitle(title, message: message, ViewController: self) 
      self.emailField.becomeFirstResponder() 
     } 
     else if !isValidEmail(emailField.text) 
     { 
      errors = true 
      message += "Invalid Email Address" 
      alertWithTitle(title, message: message, ViewController: self) 
      self.emailField.becomeFirstResponder() 
     } 
     else if passwordField.text.isEmpty 
     { 
      errors = true 
      message += "Password empty" 
      alertWithTitle(title, message: message, ViewController: self) 
      self.passwordField.becomeFirstResponder() 
     } 
     else if count(passwordField.text.utf16)<8 
     { 
      errors = true 
      message += "Password must be at least 8 characters" 
      alertWithTitle(title, message: message, ViewController: self) 
      self.passwordField.becomeFirstResponder() 
     } 

     return errors 
    } 

Hinweis Ich habe den TextField Delegate enthalten.

Warnung Titel Funktion wie gewünscht:

func alertWithTitle(title: String!, #message: String, #ViewController: UIViewController) { 
    let alert = UIAlertController(title: title, message: message, preferredStyle: .Alert) 
    let action = UIAlertAction(title: "OK", style: .Cancel, handler: nil) 
    alert.addAction(action) 
    ViewController.presentViewController(alert, animated: true, completion: nil) 
} 
+0

was haben Sie schreiben in textFieldDidBeginEditing? poste diesen Code – iAnurag

+0

@iAnurag Ich habe keine textFieldDidBeginEditing auf diesem Controller – user2363025

+0

Wie verwalten Sie Ihre Textfield Delegaten? – iAnurag

Antwort

33

Dies funktioniert für mich:

import UIKit 

class ViewController:UIViewController, UITextFieldDelegate { 

    @IBOutlet weak var fNameField: UITextField! 
    @IBOutlet weak var sNameField: UITextField! 
    @IBOutlet weak var emailField: UITextField! 
    @IBOutlet weak var passwordField: UITextField! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     fNameField.delegate = self 
     sNameField.delegate = self 
     emailField.delegate = self 
     passwordField.delegate = self 
    } 

    func isValidEmail (test:String) ->Bool{ 
     // your email validation here... 
     return true 
    } 

    func textFieldShouldReturn(textField: UITextField) -> Bool { 
     textField.resignFirstResponder() 
     if (textField == self.fNameField) { 
      self.sNameField.becomeFirstResponder() 
     } 
     else if (textField == self.sNameField) { 
      self.emailField.becomeFirstResponder() 

     } else if (textField == self.emailField) { 
      self.passwordField.becomeFirstResponder() 
     } 
     else{ 
      var thereWereErrors = checkForErrors() 
      if !thereWereErrors 
      { 
       //conditionally segue to next screen 
      } 
     } 

     return true 
    } 

    func checkForErrors() -> Bool 
    { 
     var errors = false 
     let title = "Error" 
     var message = "" 
     if fNameField.text.isEmpty { 
      errors = true 
      message += "First name empty" 
      alertWithTitle(title, message: message, ViewController: self, toFocus:self.fNameField) 

     } 
     else if sNameField.text.isEmpty 
     { 
      errors = true 
      message += "Surname empty" 
      alertWithTitle(title, message: message, ViewController: self, toFocus:self.sNameField) 

      self.sNameField.becomeFirstResponder() 
     } 
     else if emailField.text.isEmpty 
     { 
      errors = true 
      message += "Email empty" 
      alertWithTitle(title, message: message, ViewController: self, toFocus:self.emailField) 

     } 
     else if !isValidEmail(emailField.text) 
     { 
      errors = true 
      message += "Invalid Email Address" 
      alertWithTitle(title, message: message, ViewController: self, toFocus:self.emailField) 

     } 
     else if passwordField.text.isEmpty 
     { 
      errors = true 
      message += "Password empty" 
      alertWithTitle(title, message: message, ViewController: self, toFocus:passwordField) 
     } 
     else if count(passwordField.text.utf16)<8 
     { 
      errors = true 
      message += "Password must be at least 8 characters" 
      alertWithTitle(title, message: message, ViewController: self, toFocus:self.passwordField) 
     } 

     return errors 
    } 

    func alertWithTitle(title: String!, message: String, ViewController: UIViewController, toFocus:UITextField) { 
     let alert = UIAlertController(title: title, message: message, preferredStyle: .Alert) 
     let action = UIAlertAction(title: "OK", style: UIAlertActionStyle.Cancel,handler: {_ in 
      toFocus.becomeFirstResponder() 
     }); 
     alert.addAction(action) 
     ViewController.presentViewController(alert, animated: true, completion:nil) 
    } 

} 
+0

behoben habe. Andere Leute sagen, es gibt sauberere Wege, all dies zu behandeln, und dies ist das Grundproblem in deinem Code. Was ich hier gemacht habe, war, die Dinge ein wenig zu entwirren und sicherzustellen, dass das Textfeld mit dem Fehler erst nach dem Absetzen der Warnung in den Fokus rückt. –