2015-06-18 4 views
17

У меня есть 4 текстовых поля на экране регистра, и я настроил его так, что, когда пользователь нажимает рядом на каждое текстовое поле, фокусируется следующее текстовое поле. Код ниже:фокусировка текстового поля в 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 
    } 

При возврате окончательного текстового поля я вызываю функцию проверки ошибок (см. Ниже). В этом случае, если есть проблема с любым полем, я хочу сфокусировать это текстовое поле, чтобы пользователь мог легко его исправить. Что происходит, так это то, что текстовое поле с ошибкой фокусируется (по указанию функций checkForErrors) на секунду, но затем фокус переключается обратно в текстовое поле пароля. Я также попытался добавить в self.passwordField.resignFirstResponder() в последнюю оставшуюся часть вышеприведенной функции, и это заставляет поле пароля потерять фокус, но затем текстовое поле с обнаруженной проблемой не набирает фокус вообще (даже не на секунду, как раньше). Как я могу исправить это?

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 
    } 

Примечание. Я включил делегат textField.

оповещения с функцией заголовка по запросу:

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

что вы написали в textFieldDidBeginEditing? опубликуйте этот код – iAnurag

+0

@iAnurag У меня нет textFieldDidBeginEditing на этом контроллере – user2363025

+0

как вы управляете делегатами текстового поля? – iAnurag

ответ

33

Это работает для меня:

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

Как говорят другие люди, есть более чистые способы справиться со всем этим, и это основная проблема в вашем коде. То, что я здесь делал, немного распутал вещи и убедился, что текстовое поле с ошибкой только усилилось. ПОСЛЕ того, как предупреждение было отклонено. –

Смежные вопросы