'TextField: shouldChangeCharactersInRange:' का उपयोग करना, मुझे वर्तमान टाइप किए गए चरित्र सहित पाठ कैसे प्राप्त करना चाहिए?


116

जब भी उपयोगकर्ता टाइप करता है, मैं कोशिश करने के लिए नीचे दिए गए कोड का उपयोग कर रहा हूं और textField2पाठ सामग्री को मैच के लिए अद्यतन किया जाता textField1है textField1

- (BOOL) textField: (UITextField *)theTextField shouldChangeCharactersInRange: (NSRange)range replacementString: (NSString *)string {    
  if (theTextField == textField1){    
     [textField2 setText:[textField1 text]];    
  }
}

हालाँकि, मेरे द्वारा उत्पादित आउटपुट यह है कि ...

textField2 "12" है, जब textField1 "123" है

textField2 "123" है, जब textField1 "1234" है

... जब मैं चाहता हूँ:

textField2 "123" है, जब textField1 "123" है

textField2 "1234" है, जब textField1 "1234" है

मैं क्या गलत कर रहा हूं?


8
बस एक अनुस्मारक यह "एडिटिंग चेंजेड" ईवेंट का हमेशा उपयोग करने के लिए बेहद कठिन है .. बस इसे आईबी में एक फ़ंक्शन बनाने के लिए खींचें।
फेटी

ध्यान दें कि एडिटिंग चेंज किए गए ईवेंट प्रोग्रामेटिक रूप से जेनरेट किए गए किसी भी टेक्स्ट चेंजिंग इवेंट को कैप्चर नहीं करता है, जैसे ऑटोकॉरेक्ट / ऑटोकंप्लीशन / टेक्स्ट रिप्लेसमेंट।
शिम

जवाबों:


272

-shouldChangeCharactersInRangeपाठ क्षेत्र को वास्तव में अपना पाठ बदलने से पहले बुलाया जाता है , इसीलिए आपको पुराने पाठ मान मिल रहे हैं। अद्यतन उपयोग के बाद पाठ प्राप्त करने के लिए:

[textField2 setText:[textField1.text stringByReplacingCharactersInRange:range withString:string]];

15
यह लगभग मेरे लिए काम किया। अगर मैंने एक चरित्र टाइप किया, तो यह काम किया। यदि मैंने डिलीट बटन दबाया है, तो यह दो अक्षर हटा देगा। मेरे लिए, निम्नलिखित सुझाव ने काम किया: stackoverflow.com/questions/388237/… मूल रूप से, UITextField से अपने कोड में ड्रैग एन'एनरड्रॉप (एक फ़ंक्शन बनाने के लिए), फिर अपने TextField पर राइट-क्लिक करें, और Drag'n ' अपने नए फंक्शन के लिए "एडिटिंग चेंज" के लिए सर्कल से ड्रॉप करें। (आहें। मुझे कभी-कभी विजुअल स्टूडियो की याद आती है ..)
माइक ग्रील्डहिल

मुझे यह भी लगता है कि यह एक मान्य उत्तर है, लेकिन उत्तर नहीं। जो आप चाहते हैं उसे पूरा करने का सबसे अच्छा तरीका @tomute
Pedro Borges

5
या textFiel.text = (NSString के रूप में textFiel.text) .stringByReplacingCharactersInRange (रेंज, withString: स्ट्रिंग) स्विफ्ट में
मैक्स

@ मायकेगल्डहिल आप प्रोग्राम को समान रूप से कर सकते हैं:[textField addTarget:self action:@selector(textFieldEditingChanged:) forControlEvents:UIControlEventEditingChanged]
स्टीव मोजर

52
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSString * searchStr = [textField.text stringByReplacingCharactersInRange:range withString:string];

    NSLog(@"%@",searchStr);
    return YES;
}

40

स्विफ्ट 3

स्वीकृत उत्तर के आधार पर, स्विफ्ट 3 में काम करना चाहिए :

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    let newString = NSString(string: textField.text!).replacingCharacters(in: range, with: string)

    return true
}

ध्यान दें

दोनों Stringऔर NSStringविधियों बुलाया है replacingCharacters:inRange:withString। हालाँकि, जैसा कि अपेक्षित था, पूर्व को एक उदाहरण की उम्मीद है Range, जबकि बाद वाले को एक उदाहरण की उम्मीद है NSRangetextFieldप्रतिनिधि विधि एक का उपयोग करता है NSRangeउदाहरण के लिए, इस प्रकार के उपयोग के NSStringइस मामले में।


replacingCharactersहोना चाहिएstringByReplacingCharactersInRange
एलन स्कार्पा

1
@Alan_s मैंने इस स्निपेट को सीधे अपने Xcode प्रोजेक्ट से कॉपी किया और यह ठीक काम कर रहा था। क्या आप iOS 10.1 के लक्ष्य के साथ Xcode 8.1 का उपयोग कर रहे हैं?
17


13

स्विफ्ट (4) में, बिना NSString(शुद्ध स्विफ्ट):

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    if let textFieldString = textField.text, let swtRange = Range(range, in: textFieldString) {

        let fullString = textFieldString.replacingCharacters(in: swtRange, with: string)

        print("FullString: \(fullString)")
    }

    return true
}

विस्तार के रूप में:

extension UITextField {

    func fullTextWith(range: NSRange, replacementString: String) -> String? {

        if let fullSearchString = self.text, let swtRange = Range(range, in: fullSearchString) {

            return fullSearchString.replacingCharacters(in: swtRange, with: replacementString)
        }

        return nil
    }
}

// Usage:

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    if let textFieldString = textField.fullTextWith(range: range, replacementString: string) {
        print("FullString: \(textFieldString)")
    }

    return true
}

8

इसके लिए स्विफ्ट संस्करण:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    if string == " " {
        return false
    }

    let userEnteredString = textField.text

    var newString = (userEnteredString! as NSString).stringByReplacingCharactersInRange(range, withString: string) as NSString

    print(newString)

    return true
}


1

गार्ड का उपयोग करें

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
        guard case let textFieldString as NSString = textField.text where
            textFieldString.stringByReplacingCharactersInRange(range, withString: string).length <= maxLength else {
                return false
        }
        return true
    }

0

मेरा समाधान उपयोग करना है UITextFieldTextDidChangeNotification

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(copyText:) name:UITextFieldTextDidChangeNotification object:nil];

विधि [[NSNotificationCenter defaultCenter] removeObserver:self];में कॉल करने के लिए मत भूलना dealloc


0

यदि आपको इसके साथ टेक्स्टफील्ड टेक्स्ट को बदलने की आवश्यकता है, तो आप मेरे समाधान (स्विफ्ट 3) का उपयोग कर सकते हैं: https://gist.github.com/Blackjacx/2198d86442ec9b9b9b05c0801f4n39204747

प्रतिस्थापन के बाद आप केवल textField.textरचित पाठ को पुनः प्राप्त कर सकते हैं ।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.