ios - स्विफ्ट में वापसी कुंजी दबाने पर टेक्स्ट फ़ील्ड के बीच स्विच करना




iphone swift (10)

मैं एक आईओएस ऐप डिजाइन कर रहा हूं और मैं चाहता हूं कि जब मेरे आईफोन में रिटर्न की को दबाया जाए तो यह मुझे अगले निम्नलिखित टेक्स्ट फील्ड में ले जाता है।

मुझे ऐसे ही कुछ सवालों के जवाब मिले हैं, जिनके आस-पास बेहतरीन उत्तर हैं, लेकिन वे सभी सिर्फ ऑब्जेक्टिव-सी में होते हैं और मैं स्विफ्ट कोड खोज रहा हूं, अब यही वह है जो अब तक मेरे पास है:

func textFieldShouldReturn(emaillabel: UITextField) -> Bool{
    return true
}

इसे उस फ़ाइल में रखा गया है जो UIView से जुड़ी है और जिसमें पाठ फ़ील्ड शामिल हैं, लेकिन मुझे यकीन नहीं है कि सही जगह है।

मैं मूल रूप से स्विफ्ट के लिए नया हूं, इसलिए हर छोटे कदम की व्याख्या करता हूं या मैं इसे किसी तरह गड़बड़ करने का प्रबंधन करूंगा। इसके अलावा मैं Xcode के नवीनतम संस्करण का उपयोग कर रहा हूँ, अगर इससे कोई फर्क पड़ता है।

ठीक है, इसलिए मैंने इसे आज़माया और यह त्रुटि मिली:
//could not find an overload for '!=' that accepts the supplied arguments

func textFieldShouldReturn(textField: UITextField) -> Bool {
    let nextTag: NSInteger = textField.tag + 1
    // Try to find next responder
    let nextResponder: UIResponder = textField.superview!.viewWithTag(nextTag)!
    if (nextResponder != nil) {
        // could not find an overload for '!=' that accepts the supplied arguments

        // Found next responder, so set it.
        nextResponder.becomeFirstResponder()
    } else {
        // Not found, so remove keyboard.
        textField.resignFirstResponder()
    }
    return false // We do not want UITextField to insert line-breaks.
}

अग्रिम pals में धन्यवाद!


अगले पाठ फ़ील्ड में बदलने का सबसे आसान तरीका यह है कि लंबे कोड की कोई आवश्यकता नहीं है

func textFieldShouldReturn(_ textField: UITextField) -> Bool

    {

        if let nextField = textField.superview?.viewWithTag(textField.tag + 1) as? UITextField {

            nextField.becomeFirstResponder()

        } else {

            textField.resignFirstResponder()

            return true;

        }

        return false

    }

इस दृष्टिकोण को तालिका के विचारों और संग्रह के विचारों में कुछ बदलावों की आवश्यकता है, लेकिन मुझे लगता है कि सरल रूपों के लिए यह ठीक है।

अपने textFields को एक IBOutletCollection से कनेक्ट करें, इसे इसके y निर्देशांक द्वारा क्रमबद्ध करें और textFieldShouldReturn(_:) केवल अगले टेक्स्टफील्ड पर कूदें जब तक आप अंत तक नहीं पहुंचते:

// MARK: UITextFieldDelegate

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    switch textField {
    case nameTextField:
        phoneTextField.becomeFirstResponder()
    case phoneTextField:
        emailTextField.becomeFirstResponder()
    case emailTextField:
        descriptionTextField.becomeFirstResponder()
    default:
        textField.resignFirstResponder()
    }
    return false
}

या सिर्फ नमूना परियोजना को देखें (xcode 7 बीटा 4)


बस अपने textFieldShouldReturn विधि में UIResponder वर्ग की विधि becomeFirstResponder() विधि का उपयोग करें। हर UIView ऑब्जेक्ट UIResponder के उपवर्ग हैं।

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    if let nextField = self.view.viewWithTag(textField.tag + 1) as? UITextField {
        nextField.becomeFirstResponder()
    } else {
        textField.resignFirstResponder()
    }
    return false
}

आप Apple Doc's के बारे में और जानकारी यहाँ पा सकते हैं।


मेरा सुझाव है कि आपको textFieldShouldReturn(_:) में स्विच स्टेटमेंट का उपयोग करना चाहिए।

class ViewController: UIViewController, UITextFieldDelegate {

  @IBOutlet weak var txtFieldName: UITextField!
  @IBOutlet weak var txtFieldEmail: UITextField!
  @IBOutlet weak var txtFieldPassword: UITextField!

  override func viewDidLoad() {
    super.viewDidLoad()

  }

  func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    if textField == txtFieldName {
       textField.resignFirstResponder()
       txtFieldEmail.becomeFirstResponder()
    } else if textField == txtFieldEmail {
       textField.resignFirstResponder()
       txtFieldPassword.becomeFirstResponder()
    } else if textField == txtFieldPassword {
       textField.resignFirstResponder()
    }
   return true
  }
}

मैंने कई कोड आज़माए हैं और आखिरकार मेरे लिए स्विफ्ट 3.0 नवीनतम [मार्च 2017] में काम किया है।

इस कोड को काम करने के लिए "ViewController" वर्ग को "UITextFieldDelegate" विरासत में मिला।

@IBOutlet var textFields: [UITextField]!

...

textFields.sortInPlace { $0.frame.origin.y < $1.frame.origin.y }

...

func textFieldShouldReturn(textField: UITextField) -> Bool {
    if let currentIndex = textFields.indexOf(textField) where currentIndex < textFields.count-1 {
        textFields[currentIndex+1].becomeFirstResponder()
    } else {
        textField.resignFirstResponder()
    }
    return true
}    

उचित टैग nuber के साथ पाठ फ़ील्ड जोड़ें और इस टैग संख्या का उपयोग इसे निर्दिष्ट किए गए वृद्धिशील टैग संख्या के आधार पर उपयुक्त पाठ फ़ील्ड पर नियंत्रण करने के लिए किया जाता है।

class ViewController: UIViewController,UITextFieldDelegate  

उपरोक्त कोड में, "returnKeyType = UIReturnKeyType.next" जहां कुंजी पैड को "नेक्स्ट" के रूप में प्रदर्शित करने के लिए कुंजी बनाएगा, आपके पास "जॉइन / गो" आदि के रूप में अन्य विकल्प भी हैं, जो आपके एप्लिकेशन के मूल्यों को बदलते हैं।

यह "textFieldShouldReturn" UITextFieldDelegate नियंत्रित करने का एक तरीका है और यहां टैग मूल्य वृद्धि के आधार पर हमारा अगला क्षेत्र चयन है

override func viewDidLoad() {

 userNameTextField.delegate = self

        userNameTextField.tag = 0

        userNameTextField.returnKeyType = UIReturnKeyType.next

        passwordTextField.delegate = self

        passwordTextField.tag = 1


        passwordTextField.returnKeyType = UIReturnKeyType.go

}

यदि आपके पास बहुत सारे टेक्स्टफील्ड घटक हैं, तो यह बेहतर हो सकता है कि आउटलेट संग्रह का उपयोग करना, टेक्स्टफील्ड को जोड़ना और इंटरफ़ेस बिल्डर से रिटर्न कुंजी सेट करना

@IBOutlet var formTextFields: [UITextField]!

override func viewDidLoad() {
  for textField in formTextFields {
    textField.delegate = self
  }
}

extension RegisterViewController: UITextFieldDelegate {
  func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    if let componentIndex = formTextFields.firstIndex(of: textField) {
      if textField.returnKeyType == .next,
        componentIndex < (formTextFields.count - 1) {
        formTextFields[componentIndex + 1].becomeFirstResponder()
      } else {
        textField.resignFirstResponder()
      }
    }
    return true
  }
}

सुनिश्चित करें कि आपके UITextField प्रतिनिधि सेट हैं और टैग ठीक से इंक्रीमेंट किए गए हैं। यह इंटरफ़ेस बिल्डर के माध्यम से भी किया जा सकता है।

यहाँ एक ओबज-सी पोस्ट का लिंक दिया गया है जो मैंने पाया: टेक्स्टफिल्ड (नेक्स्ट / डन बटन) के माध्यम से कैसे नेविगेट करें

class ViewController: UIViewController,UITextFieldDelegate 
{
   //Link each UITextField
   @IBOutlet weak var textField: UITextField!

   override func viewDidLoad() 
   {
      super.viewDidLoad()
      // Do this for each UITextField
      textField.delegate = self
      textField.tag = 0 //Increment accordingly
   }

   func textFieldShouldReturn(_ textField: UITextField) -> Bool 
   {
      // Try to find next responder
      if let nextField = textField.superview?.viewWithTag(textField.tag + 1) as? UITextField {
         nextField.becomeFirstResponder()
      } else {
         // Not found, so remove keyboard.
         textField.resignFirstResponder()
      }
      // Do not add a line break
      return false
   }
}

स्विफ्ट / प्रोग्रामेटिक रूप से

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
    let txtTag:Int = textField.tag

    if let textFieldNxt = self.view.viewWithTag(txtTag+1) as? UITextField {
        textFieldNxt.becomeFirstResponder()
    }else{
        textField.resignFirstResponder()
    }

    return true
}

स्विफ्ट 4.2

यह एक अधिक जेनेरिक और सबसे आसान समाधान है, आप इस कोड का उपयोग किसी भी राशि के TextFields के साथ कर सकते हैं। बस UITextFieldDelegate इनहेरिट करें और ऑर्डर के अनुसार टेक्स्टफील्ड टैग को अपडेट करें और इस फ़ंक्शन को कॉपी करें

if self.emaillabel.isEqual(self.anotherTextField)
{
    self.anotherTextField.becomeFirstResponder()
}

स्विफ्ट 5

कीबोर्ड में रिटर्न कुंजी पर क्लिक करने पर आप आसानी से किसी अन्य टेक्स्टफिल्ड पर स्विच कर सकते हैं।

  • सबसे पहले, आपका दृश्य नियंत्रक UITextFieldDelegate अनुरूप है और ViewController में textFieldShouldReturn(_:) प्रतिनिधि विधि जोड़ें
  • इंटरफ़ेस बिल्डर में TextField से ViewController तक खींचें। फिर delegate विकल्प चुनें। नोट : यह सभी TextField के लिए करें
  • सभी TextFields के लिए एक IBOutlet बनाएँ

    func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        let nextTag: NSInteger = textField.tag + 1
        // Try to find next responder
        let nextResponder = textField.superview!.viewWithTag(nextTag)
        if (nextResponder != nil) {
            // could not find an overload for '!=' that accepts the supplied arguments
    
            // Found next responder, so set it.
            nextResponder?.becomeFirstResponder()
        } else {
            // Not found, so remove keyboard.
            textField.resignFirstResponder()
        }
        return false // We do not want UITextField to insert line-breaks.
    }






xcode6