2015-06-18 16 views
17

Mam 4 pola tekstowe na ekranie rejestru i mam je skonfigurowane tak, że gdy użytkownik naciśnie następne pole tekstowe, następne pole tekstowe jest skupione. Kod poniżej:ogniskowanie pola tekstowego w szybkim tempie

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 
    } 

Po powrocie z pola tekstowego końcowego, wzywam czek na funkcję błędów (poniżej). W tym przypadku, jeśli występuje problem z dowolnym polem, chcę skupić się na tym polu tekstowym, aby użytkownik mógł łatwo go poprawić. Dzieje się tak, że pole tekstowe z błędem ustawia ostrość (zgodnie z instrukcjami funkcji checkForErrors) przez sekundę, ale wtedy fokus przełącza się z powrotem do pola tekstowego hasła. Próbowałem również dodać w ostatnim ostatnim z powyższych funkcji self.passwordField.resignFirstResponder() i to powoduje, że pole hasła traci ostrość, ale wtedy pole tekstowe z napotkanym problemem nie zyskuje w ogóle ostrości (nawet na sekundę, jak poprzednio). Jak mogę naprawić to?

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 
    } 

Uwaga Uwzględniłem delegata textField.

alarm z funkcją tytułowego jako wniosek:

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

co napisałeś w textFieldDidBeginEditing? po tym kodzie – iAnurag

+0

@iAnurag Nie mam textFieldDidBeginEditing na tym kontrolerze – user2363025

+0

jak zarządzasz swoimi delegatami pola tekstowego? – iAnurag

Odpowiedz

33

Działa to dla mnie:

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

Ponieważ inni ludzie mówią, że istnieją czystsze sposoby radzenia sobie z tym wszystkim i to jest główny problem w twoim kodzie. To, co tu zrobiłem, trochę rozplątało i upewniło się, że pole tekstowe z błędem zyskało ostrość dopiero po tym, jak alarm został odrzucony. –