2015-06-18 6 views
17

में एक टेक्स्ट फ़ील्ड पर ध्यान केंद्रित करने के लिए मेरे पास एक रजिस्टर स्क्रीन पर 4 टेक्स्टफील्ड हैं और मैंने इसे स्थापित किया है ताकि जब उपयोगकर्ता प्रत्येक टेक्स्ट फ़ील्ड पर अगला दबाए, तो अगला टेक्स्ट फ़ील्ड केंद्रित हो। नीचे कोड:स्विफ्ट

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 
    } 

अंतिम टेक्स्ट फ़ील्ड की वापसी पर, मैं त्रुटियों के फ़ंक्शन (नीचे) के लिए चेक बुला रहा हूं। इसके भीतर यदि किसी भी क्षेत्र में कोई समस्या है तो मैं उस टेक्स्ट फ़ील्ड पर ध्यान केंद्रित करना चाहता हूं ताकि उपयोगकर्ता इसे आसानी से सही कर सके। क्या हो रहा है कि त्रुटि वाला टेक्स्ट फ़ील्ड फोकस कर रहा है (जैसा कि चेकफोरर फ़ंक्शन द्वारा निर्देशित किया गया है) लेकिन फिर फ़ोकस पासवर्ड टेक्स्ट फ़ील्ड पर वापस स्विच हो रहा है। मैंने उपरोक्त फ़ंक्शन के आखिरी में 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 
    } 

नोट मैंने टेक्स्टफ़ील्ड प्रतिनिधि को शामिल किया है।

शीर्षक समारोह के साथ चेतावनी के रूप में अनुरोध:

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 मेरे पास इस नियंत्रक – 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

में मेरी समस्या को ठीक करने के बाद सुझाए गए तरीके को देखेंगे क्योंकि अन्य लोग कहते हैं कि इन सभी को संभालने के लिए क्लीनर तरीके हैं और यह मूल समस्या है आपके कोड में मैंने जो कुछ किया वह थोड़ा उलझन में था और यह सुनिश्चित कर रहा था कि त्रुटि के साथ टेक्स्टफील्ड केवल चेतावनी प्राप्त कर दिया गया था जब चेतावनी खारिज कर दी गई थी। –