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




iphone swift (11)

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

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

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.
}

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


शुद्धतावादियों के लिए एक वैकल्पिक तरीका, जो टैग का उपयोग करना पसंद नहीं करते हैं, और चाहते हैं कि घटकों को अलग या यूनी-दिशात्मक रखने के लिए UITextField प्रतिनिधि सेल हो ...

  1. सेल और TableViewController को जोड़ने के लिए एक नया प्रोटोकॉल बनाएं।

    protocol CellResponder {
      func setNextResponder(_ fromCell: UITableViewCell)
    }
  2. प्रोटोकॉल को अपने सेल में जोड़ें, जहाँ आपका TextField डेलिगेट भी सेल है (मैं स्टोरीबोर्ड में ऐसा करता हूं)।

    class MyTableViewCell: UITableViewCell, UITextFieldDelegate {
      var responder: CellResponder?
    
      func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        responder?.setNextResponder(self)
        return true
      }
    }
  3. अपने TableViewController को CellResponder प्रोटोकॉल (यानी class MyTableViewController: UITableViewController, CellResponder ) के अनुरूप बनाएं और अपनी class MyTableViewController: UITableViewController, CellResponder विधि लागू करें। यानी यदि आपके पास अलग-अलग सेल प्रकार हैं तो आप ऐसा कर सकते हैं, इसी तरह आप IndexPath में पास हो सकते हैं, एक टैग का उपयोग कर सकते हैं, आदि .. cell.responder = self cellForRow में cell.responder = self सेट करना न भूलें।

    func setNextResponder(_ fromCell: UITableViewCell) {
      if fromCell is MyTableViewCell, let nextCell = tableView.cellForRow(at: IndexPath(row: 1, section: 0)) as? MySecondTableViewCell {
    
        nextCell.aTextField?.becomeFirstResponder()
    
      } ....
    }

स्विफ्ट 4.0 में कालेब का संस्करण

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

पुनश्च textField.superview? मेरे लिए काम नहीं कर रहा


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

override func viewDidLoad() {
        super.viewDidLoad()

        emailTextField.delegate = self
        passwordTextField.delegate = self
    }


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

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

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

@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
}    

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


मेरा सुझाव है कि आपको 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
}

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

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

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


स्विफ्ट 4.2

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

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
}

मेरे पास आपके प्रश्न का एक अच्छा समाधान है।

कदम:

1 - स्टोरीबोर्ड से अपनी वापसी कुंजी सेट करें।

2 - आपकी स्विफ्ट फ़ाइल में।

func textFieldShouldReturn(_ textField: UITextField) -> Bool {
        if textField.returnKeyType == .next {
            Email.resignFirstResponder()
            Password.becomeFirstResponder()
        } else if textField.returnKeyType == .go {
            Password.resignFirstResponder()
            self.Login_Action()
        }
        return true
    }

3 - Textfield के प्रतिनिधि सेट करने के लिए मत भूलना।

धन्यवाद :)


स्विफ्ट 4

आप आसानी से किसी अन्य TextField में स्विच कर सकते हैं।

  • UITextFieldDelegate जोड़ें और ViewController में textFieldShouldReturn(_:) विधि जोड़ें
  • इंटरफ़ेस बिल्डर में TextField से ViewController तक खींचें। फिर delegate संपत्ति का चयन करें। नोट : सभी TextField के लिए ऐसा करें
  • सभी TextFields के लिए एक IBOutlet बनाएं

    class ViewController: UIViewController, UITextFieldDelegate {
    
      @IBOutlet weak var txtFieldName: UITextField!
      @IBOutlet weak var txtFieldEmail: UITextField!
      @IBOutlet weak var txtFieldPassword: UITextField!
    
      override func viewDidLoad() {
        super.viewDidLoad()
    
      }
    
      //MARK: - Controlling the Keyboard
      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 (पिछले संस्करणों के लिए इतिहास को संपादित करें):

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
   }
}

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

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


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

@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
  }
}




xcode6