2015-06-18 29 views
17

Ho 4 campi di testo su una schermata di registro e l'ho impostato in modo che quando l'utente preme il prossimo campo di testo, il campo di testo successivo sia focalizzato. Codice seguente:mettere a fuoco un campo di testo 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 
    } 

Sulla restituzione del campo di testo finale, chiamo una funzione di controllo degli errori (sotto). All'interno di questo se c'è un problema con qualsiasi campo, voglio mettere a fuoco quel campo di testo in modo che l'utente possa facilmente correggerlo. Quello che sta succedendo è che il campo di testo con l'errore si sta concentrando (come indicato dalle funzioni checkForErrors) per un secondo, ma poi lo stato attivo sta tornando al campo di testo della password. Ho anche provato ad aggiungere in self.passwordField.resignFirstResponder() l'ultimo altro della funzione sopra e che rende il campo della password perdere fuoco ma poi il campo di testo con il problema riscontrato non sta guadagnando il focus a tutti (nemmeno per un secondo come prima) Come posso risolvere Questo?

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 
    } 

Nota Ho incluso il delegato del campo di testo.

allarme con funzione di titolo come richiesto:

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

quello che hai scritto in textFieldDidBeginEditing? inserisci il codice – iAnurag

+0

@iAnurag Non ho un textFieldDidBeginEditing su questo controller – user2363025

+0

come stai gestendo i tuoi delegati per i campi di testo? – iAnurag

risposta

33

Questo funziona per me:

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

Come altri dicono che ci sono modi più semplici per gestire tutto questo e questo è il problema di root nel tuo codice. Quello che ho fatto qui è stato districare un po 'le cose e assicurarmi che il campo di testo con l'errore si sia concentrato solo dopo che l'avviso è stato chiuso. –