दिलचस्प पोस्ट
एक्लिप्स खोज से फ़ोल्डरों को बाहर निकालें फ़ंक्शन में डेटा कैसे प्राप्त करें नियंत्रक बढ़ाएं? एक अनंत सूची की परिमित समझ एंड्रॉइड जीसीएम और कई टोकन Win32: सक्रिय निर्देशिका के खिलाफ क्रेडेंशियल्स को कैसे मान्य करें? सी में ऑपरेटर ओवरलोडिंग आईफोन एसडीके: लोड विएव और डिडलोड में अंतर क्या है? ग्रोवि शेल चेतावनी "प्रीफेस रूट नोड को खोल नहीं सकता / बना सकता है …" CADisplayLink ओपनगैल रेंडरिंग ब्रेक UIScrollView व्यवहार निर्धारित करें कि एक समन्वय दूसरे के त्रिज्या में है दिए गए पाठ में सबसे अधिक इस्तेमाल किए जाने वाले शब्दों का एक एएससीआईआई चार्ट बनाएं मान्यकरण विफल: अपलोड फ़ाइल में एक एक्सटेंशन है जो इसकी सामग्री से मेल नहीं खाता है JQuery में चालू () में चालू () चालू करना क्यों नहीं एक सरल "हैलो वर्ल्ड" शैली कार्यक्रम टर्बो सी ++ के साथ संकलन करता है? कैसे एक SQLite तालिका से पिछले autoincremented आईडी को पुनः प्राप्त करें?

वापसी कुंजी के रूप में "अगला" का उपयोग करना

मैं "बटन" के स्थान पर अगला बटन प्राप्त करने के लिए "वापस लौटें" के लिए "अगला" मान का उपयोग करता हूं, लेकिन (स्पष्ट रूप से) इसे दबाकर मेरे दृश्य में अगले UITextField पर स्थानांतरित नहीं होता है

ऐसा करने का सही तरीका क्या है? मैंने बहुत सारे उत्तर देखे हैं, लेकिन किसी के पास एक त्वरित समाधान है?

Solutions Collecting From Web of "वापसी कुंजी के रूप में "अगला" का उपयोग करना"

सुनिश्चित करें कि आपके पाठ फ़ील्ड के पास उनके प्रतिनिधि सेट और textFieldShouldReturn विधि को लागू करते हैं। यह वह विधि है जिसे कहा जाता है जब उपयोगकर्ता वापसी कुंजी को टैप करता है (कोई फर्क नहीं पड़ता कि यह कैसा दिखता है)।

विधि कुछ ऐसा दिखाई दे सकती है:

 func textFieldShouldReturn(textField: UITextField) -> Bool { if textField == self.field1 { self.field2.becomeFirstResponder() } return true } 

वास्तविक तर्क यहां भिन्न हो सकता है कई तरीके हैं, और मैं निश्चित रूप से एक बड़े पैमाने पर if / else श्रृंखला के बारे में सलाह देता हूं अगर आपके पास बहुत सारे पाठ फ़ील्ड हैं, लेकिन ये यज्ञ है कि यह निर्धारित करने के लिए कि क्या दृश्य सक्रिय हो जाना चाहिए, वर्तमान में क्या दृश्य सक्रिय है। एक बार जब आप यह निर्धारित कर लें कि कौन सा दृश्य सक्रिय हो जाना चाहिए, तो देखें कि दृश्य का becomeFirstResponder तरीका becomeFirstResponder विधि becomeFirstResponder


कुछ कोड सफाई के लिए, आप UITextField एक्सटेंशन पर विचार कर सकते हैं जो कुछ ऐसा दिखता है:

 private var kAssociationKeyNextField: UInt8 = 0 extension UITextField { var nextField: UITextField? { get { return objc_getAssociatedObject(self, &kAssociationKeyNextField) as? UITextField } set(newField) { objc_setAssociatedObject(self, &kAssociationKeyNextField, newField, .OBJC_ASSOCIATION_RETAIN) } } } 

और फिर हमारे textFieldShouldReturn विधि को इस तरह देखने के लिए बदलें:

 func textFieldShouldReturn(textField: UITextField) -> Bool { textField.nextField?.becomeFirstResponder() return true } 

एक बार जब आप ऐसा करते हैं, तो यह प्रत्येक पाठ फ़ील्ड की नई nextField प्रॉपर्टी को nextField करने के मामले में होना चाहिए:

 self.field1.nextField = self.field2 self.field2.nextField = self.field3 self.field3.nextField = self.field4 self.field4.nextField = self.field1 

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

इस तरह दिखने के लिए एक्सटेंशन बदलें:

 private var kAssociationKeyNextField: UInt8 = 0 extension UITextField { @IBOutlet var nextField: UITextField? { get { return objc_getAssociatedObject(self, &kAssociationKeyNextField) as? UITextField } set(newField) { objc_setAssociatedObject(self, &kAssociationKeyNextField, newField, .OBJC_ASSOCIATION_RETAIN) } } } 

और अब इंटरफ़ेस बिल्डर में nextField प्रॉपर्टी को हुक कर nextField :

यहां छवि विवरण दर्ज करें

(जब आप यहां भी आए तो अपने प्रतिनिधि को सेट करें।)


और जाहिर है, अगर nextField संपत्ति nil वापस आती है, तो कुंजीपटल सिर्फ छुपाता है

स्विफ्ट में यह एक उदाहरण है:

मैंने 6 UITextField एस के साथ एक स्क्रीन बनाई मैंने इन्हें इंटरफ़ेस बिल्डर में 1 से 6 में टैग्स को असाइन किया है। मैंने आईबी में वापसी कुंजी को भी बदल दिया। फिर मैंने निम्नलिखित को लागू किया:

 import UIKit // Make your ViewController a UITextFieldDelegate class ViewController: UIViewController, UITextFieldDelegate { // Use a dictionary to define text field order 1 goes to 2, 2 goes to 3, etc. let nextField = [1:2, 2:3, 3:4, 4:5, 5:6, 6:1] override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. // Make ourselves the delegate of the text fields so that textFieldShouldReturn // will be called when the user hits the Next/Return key for i in 1...6 { if let textField = self.view.viewWithTag(i) as? UITextField { textField.delegate = self } } } // This is called when the user hits the Next/Return key func textFieldShouldReturn(textField: UITextField) -> Bool { // Consult our dictionary to find the next field if let nextTag = nextField[textField.tag] { if let nextResponder = textField.superview?.viewWithTag(nextTag) { // Have the next field become the first responder nextResponder.becomeFirstResponder() } } // Return false here to avoid Next/Return key doing anything return false } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } } 

अन्य उत्तरों में कुछ भी गलत नहीं है, यह ओओपी – इमो पर अधिक ध्यान केंद्रित करने के लाभ के साथ एक अलग दृष्टिकोण है (हालांकि यह थोड़ी अधिक काम करता है, फिर भी इसका पुन: उपयोग किया जा सकता है) स्टोरीबोर्ड में, मैं एक अलग श्रेणी (जैसे 800-810) के साथ टैग जोड़ना शुरू कर देता हूं जो कि उन क्षेत्रों के विशिष्ट क्रम को परिभाषित करता है जिन्हें मैं बीच में स्थानांतरित करना चाहता हूं। इसके मुख्य दृश्य में सभी सबव्यूवुड में काम करने का लाभ है ताकि एक यूआईटीक्स्टफिल्ड और यूआईटीक्स्टव्यूज़ (और किसी अन्य नियंत्रण) के बीच की आवश्यकता के अनुसार नेविगेट कर सकें।

आम तौर पर – आम तौर पर दृश्य नियंत्रक संदेश दृश्य और कस्टम ईवेंट हैंडलर ऑब्जेक्ट के बीच देखने का प्रयास करते हैं I इसलिए मैं एक कस्टम प्रतिनिधि वर्ग से दृश्य नियंत्रक के पास एक संदेश (उर्फ, एनएसएनटिफिकेशन) का उपयोग कर रहा हूं I

(टेक्स्टफील्ड प्रतिनिधि सौंपनेवाला)

नोट: AppDelegate.swift में: डिफ़ॉल्ट केंद्र दें = NSNotificationCenter.defaultCenter ()

 //Globally scoped struct MNGTextFieldEvents { static let NextButtonTappedForTextField = "MNGTextFieldHandler.NextButtonTappedForTextField" } class MNGTextFieldHandler: NSObject, UITextFieldDelegate { var fields:[UITextField]? = [] func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { return true } func textFieldDidBeginEditing(textField: UITextField) { textField.backgroundColor = UIColor.yellowColor() } func textFieldDidEndEditing(textField: UITextField) { textField.backgroundColor = UIColor.whiteColor() } func textFieldShouldBeginEditing(textField: UITextField) -> Bool { return true } func textFieldShouldClear(textField: UITextField) -> Bool { return false } func textFieldShouldEndEditing(textField: UITextField) -> Bool { return true } func textFieldShouldReturn(textField: UITextField) -> Bool { //passes the message and the textField (with tag) calling the method defaultCenter.postNotification(NSNotification(name: MNGTextFieldEvents.NextButtonTappedForTextField, object: textField)) return false } } 

इससे मेरे दृश्य नियंत्रक को ऑब्जेक्ट, मॉडल और दृश्य के बीच मेसेजिंग को संभालने की मुख्य कार्य पर केंद्रित रहने की सुविधा मिलती है।

(देखें नियंत्रक प्रतिनिधि से एक संदेश प्राप्त करता है और advanceToNextField फ़ंक्शन का उपयोग करके निर्देशों को पास करता है)

नोट: मेरे स्टोरीबोर्ड में मेरे कस्टम हैंडलर वर्गों को एक NSObject का उपयोग करके परिभाषित किया गया है और यह ऑब्जेक्ट स्टोरीबोर्ड में उन नियंत्रकों के प्रतिनिधि के रूप में जुड़ा हुआ है जिनके लिए मुझे मॉनिटर की आवश्यकता है I कौन सा कस्टम हैंडलर वर्ग को स्वचालित रूप से आरंभ करने के कारण होता है

 class MyViewController: UIViewController { @IBOutlet weak var tagsField: UITextField! { didSet { (tagsField.delegate as? MNGTextFieldHandler)!.fields?.append(tagsField) } } @IBOutlet weak var titleField: UITextField!{ didSet { (titleField.delegate as? MNGTextFieldHandler)!.fields?.append(titleField) } } @IBOutlet weak var textView: UITextView! { didSet { (textView.delegate as? MNGTextViewHandler)!.fields?.append(textView) } } private struct Constants { static let SelectorAdvanceToNextField = Selector("advanceToNextField:") } override func viewWillAppear(animated: Bool) { super.viewWillAppear(animated) registerEventObservers() } override func viewDidDisappear(animated: Bool) { super.viewDidDisappear(animated) deRegisterEventObservers() } func advanceToNextField(notification:NSNotification) { let currentTag = (notification.object as! UIView).tag for aView in self.view.subviews { if aView.tag == currentTag + 1 { aView.becomeFirstResponder() } } } func registerEventObservers () { defaultCenter.addObserver(self, selector: Constants.SelectorAdvanceToNextField, name: MNGTextFieldEvents.NextButtonTappedForTextField, object: nil) } func deRegisterEventObservers() { defaultCenter.removeObserver(self, name: MNGTextFieldEvents.NextButtonTappedForTextField, object: nil) } .... } 

परिणाम प्राप्त करने का एक और तरीका है कि मुझे मददगार मिले मेरे ऐप में 11 पाठ फ़ील्ड थीं, पाठ के बाद के दृश्य। मुझे अगली कुंजी का उपयोग करके सभी क्षेत्रों के माध्यम से चक्र करने में सक्षम होना चाहिए और फिर पाठ दृश्य (यानी अन्य नोट्स) के बाद कीबोर्ड को इस्तीफा देना चाहिए।

स्टोरीबोर्ड में, मैं 1 से 12, 12 के साथ शुरू होने वाली सभी फ़ील्ड (टेक्स्ट और टेक्स्टव्यूव्यूज दोनों) पर टैग सेट कर रहा हूं।

मुझे यकीन है कि ऐसा करने के अन्य तरीके हैं और यह विधि सही नहीं है, लेकिन उम्मीद है कि यह किसी को मदद करता है

कोड में, मैंने निम्नलिखित लिखा:

 func textFieldShouldReturn(textField: UITextField) -> Bool { let nextTag = textField.tag + 1 //Handle Textview transition, Textfield programmatically if textField.tag == 11 { //Current tag is 11, next field is a textview self.OtherNotes.becomeFirstResponder() } else if nextTag > 11 { //12 is the end, close keyboard textField.resignFirstResponder() } else { //Between 1 and 11 cycle through using next button let nextResponder = self.view.viewWithTag(nextTag) as? UITextField nextResponder?.becomeFirstResponder() } return false } func textFieldDidEndEditing(textField: UITextField) { textField.resignFirstResponder() } func textView(textView: UITextView, shouldChangeTextInRange range: NSRange, replacementText text: String) -> Bool { //Remove keyboard when clicking Done on keyboard if(text == "\n") { textView.resignFirstResponder() return false } return true }