`টেক্সটফিল্ড: shouldChageCharactersInRange: Using ব্যবহার করে, বর্তমান টাইপ করা অক্ষর সহ আমি কীভাবে পাঠ্য পেতে পারি?


116

আমি চেষ্টা করার জন্য নীচের কোডটি ব্যবহার করছি এবং যখনই ব্যবহারকারী টাইপ করুন তার textField2মেলতে টেক্সট সামগ্রী আপডেট হবে ।textField1textField1

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

তবে আমি যে আউটপুটটি পর্যবেক্ষণ করছি তা হ'ল ...

টেক্সটফিল্ড 2 "12" হয়, যখন পাঠ্য ফিল্ড 1 "123" হয়

পাঠ্য ফিল্ড 2 "123" হয়, যখন পাঠ্য ফিল্ড 1 "1234" হয়

... যখন আমি চাই তা হল:

টেক্সটফিল্ড 2 "123" হয়, যখন পাঠ্য ফিল্ড 1 "123" হয়

পাঠ্য ফিল্ড 2 "1234" হয়, যখন পাঠ্য ফিল্ড 1 "1234" হয়

আমি কি ভুল করছি?


8
কেবলমাত্র একটি অনুস্মারক হ'ল সর্বদা "সম্পাদনা পরিবর্তিত" ইভেন্টটি ব্যবহার করা অবিশ্বাস্যরকম সহজ .. আপনার তৈরি কোনও ফাংশনে এটি কেবল আইবিতে টেনে আনুন।
ফ্যাটি

নোট করুন সম্পাদনা পরিবর্তিত ইভেন্ট প্রোগ্রামগতভাবে উত্পন্ন ইভেন্টগুলি কোনও পাঠ্যকে ক্যাপচার করে না, যেমন স্বতঃসংশোধন / স্বতঃপূরণ / পাঠ্য প্রতিস্থাপন।
শিম 18

উত্তর:


272

-shouldChangeCharactersInRangeপাঠ্য ক্ষেত্রটি প্রকৃতপক্ষে তার পাঠ্য পরিবর্তন করার আগে ডাকা হয়ে যায় , এজন্য আপনি পুরানো পাঠ্য মান পাচ্ছেন। আপডেট ব্যবহারের পরে পাঠ্য পেতে:

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

15
এটি প্রায় আমার জন্য কাজ করে। আমি যদি একটি চরিত্র টাইপ করি তবে এটি কাজ করে। আমি যদি মুছুন বোতামটি টিপিত হয় তবে এটি দুটি অক্ষর মুছবে। আমার জন্য, নিম্নলিখিত পরামর্শ কাজ: stackoverflow.com/questions/388237/... UITextField থেকে মূলত, সরান এবং নিক্ষেপ আপনার কোড (একটি ফাংশন তৈরী করা), তারপর আপনার পাঠ্যক্ষেত্র ডানে ক্লিক করুন, এবং drag'n 'মধ্যে আপনার নতুন ফাংশনে "সম্পাদনা পরিবর্তন হয়েছে" এর জন্য বৃত্ত থেকে বাদ দিন। (দীর্ঘশ্বাস। আমি মাঝে মাঝে ভিজ্যুয়াল স্টুডিওটি মিস করি ..)
মাইক গ্লেডহিল

আমিও মনে করি এটি একটি বৈধ উত্তর, তবে উত্তর নয়। আপনি যা চান তা সম্পাদনের সর্বোত্তম উপায়টি @ টমিউট দ্বারা জবাব দেওয়া হয়েছিল
পেড্রো বোর্জেস

5
অথবা টেক্সটফিল.টেক্সট = (এনএসএসটিং হিসাবে টেক্সটফিল.টেক্সট)। স্ট্রিংবাইরপ্লেসিংচার্যাক্টরসইনরেঞ্জ (রেঞ্জ, স্ট্রিং সহ: স্ট্রিং) সুইফটে
সর্বোচ্চ

@ মাইকগ্লেডহিল আপনি একই কাজটি প্রোগ্রামগতভাবে করতে পারেন:[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
@ অ্যালান_স আমি এই স্নিপেটটি সরাসরি আমার এক্সকোড প্রকল্প থেকে অনুলিপি করেছি এবং এটি ভাল কাজ করছে working আপনি কি আইওএস 10.1 এর লক্ষ্যবস্তুতে এক্সকোড 8.1 ব্যবহার করছেন?
ফোকরনার


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/2198d86442ec9b9b05c0801f4e392047

প্রতিস্থাপনের পরে আপনি কেবল textField.textরচিত পাঠ্যটি পুনরুদ্ধার করতে পারেন ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.