ইউআইটিেক্সটফিল্ড পাঠ্য পরিবর্তন ইভেন্ট


563

আমি কীভাবে কোনও পাঠ্যফিল্ডে কোনও পাঠ্য পরিবর্তন সনাক্ত করতে পারি? প্রতিনিধি পদ্ধতি shouldChangeCharactersInRangeকোনও কিছুর জন্য কাজ করে তবে এটি আমার প্রয়োজনীয়তাটি পুরোপুরি পূরণ করে নি। যেহেতু এটি হ্যাঁ ফেরত না পাওয়া পর্যন্ত টেক্সটফিল্ড পাঠ্যগুলি অন্য পর্যবেক্ষক পদ্ধতিতে উপলব্ধ নয়।

যেমন আমার কোডটিতে calculateAndUpdateTextFieldsআপডেট হওয়া পাঠ্যটি পেল না, ব্যবহারকারী টাইপ করেছেন।

textChangedজাভা ইভেন্ট হ্যান্ডলারের মতো কিছু পাওয়ার কি কোনও উপায় ।

- (BOOL)textField:(UITextField *)textField 
            shouldChangeCharactersInRange:(NSRange)range 
            replacementString:(NSString *)string 
{
    if (textField.tag == kTextFieldTagSubtotal 
        || textField.tag == kTextFieldTagSubtotalDecimal
        || textField.tag == kTextFieldTagShipping
        || textField.tag == kTextFieldTagShippingDecimal) 
    {
        [self calculateAndUpdateTextFields];

    }

    return YES;
}

3
এটি 1000 টি ভোট সহ একটি এসও উত্তরের একটি ভাল উদাহরণ যা সম্পূর্ণ ভুল । আইওএস হ'ল কৃপণ, দুর্যোগপূর্ণ এবং গোচায়ায় পূর্ণ।
ফ্যাটি

উত্তর:


1056

থেকে সঠিক ভাবে টেক্সট পরিবর্তন কল ব্যাক uitextfield করতে :

আমি ইউআইটিেক্সটফিল্ডে প্রেরিত অক্ষরগুলিকে এমন কিছু নিয়ন্ত্রণ করি:

// Add a "textFieldDidChange" notification method to the text field control.

উদ্দেশ্য-সি তে:

[textField addTarget:self 
              action:@selector(textFieldDidChange:) 
    forControlEvents:UIControlEventEditingChanged];

সুইফটে:

textField.addTarget(self, action: #selector(textFieldDidChange), for: .editingChanged)

তারপরে textFieldDidChangeপদ্ধতিতে আপনি টেক্সটফিল্ডের বিষয়বস্তুগুলি পরীক্ষা করতে পারেন এবং আপনার টেবিলের ভিউটি প্রয়োজনীয়ভাবে পুনরায় লোড করতে পারেন।

আপনি এটি ব্যবহার করতে পারেন এবং আপনার হিসাবে ক্যালকুলেট এবং আপডেট টেক্সটফিল্ডগুলি রাখতে পারেন selector


18
এটিই আরও ভাল সমাধান - কারণ আপনি এটি নিবস বা স্টোরিবোর্ডগুলিতেও সেট করতে পারেন এবং আপনাকে অতিরিক্ত ইউআইটিেক্সটফিল্ডটেক্সটডিড চেঞ্জ নোটিকেশন কোডটি লিখতে হবে না
পোস্টকোডিজম

3
একটাই ইস্যু। এটি আমার জন্য একসাথে কাজ করে না - (BOOL) টেক্সটফিল্ড: (ইউআইটিেক্সটফিল্ড *) টেক্সটফিল্ড চ্যাঞ্জচ্যাকার্টারস ইনরেঞ্জ: (এনএসরেঞ্জ) রেঞ্জ রিপ্লেসমেন্ট স্ট্রিং: (এনএসএসটিং *) স্ট্রিং
iWheelBuy

4
@ iWheelBuy কেবলমাত্র যখন এটি ফিরে আসে NO, যা যৌক্তিক কারণ আপনি যখন NOএই পদ্ধতি থেকে ফিরে আসবেন , আপনি মূলত বলছেন ক্ষেত্রের পাঠ্যটি পরিবর্তন করা উচিত নয়।
গীতারিক

2
পরিবর্তনগুলি সম্পাদনার জন্য এটি দুর্দান্ত। এটা তোলে কর্মসূচি যে পরিবর্তন মাধ্যমে ঘটতে ধরতে না: textField.text = "Some new value";। এটি ধরার কোনও চালাক উপায় আছে?
বেঞ্জহান

10
আপনি অ্যাপলের সাথে ভাবতেন UITextFieldDelegateযে এর মতো কিছু func textField: UITextField, didChangeText text: Stringঅন্তর্ভুক্ত করা হত তবে ... (অ্যাপলকে বলছি একটি নোংরা চেহারা দেয়)
ব্র্যান্ডন এ

394

জেন এলিমেন্টের উত্তর স্পট রয়েছে।

উপরেরটি ইন্টারফেস বিল্ডারেও ইউআইটিেক্সটফিল্ডে ডান-ক্লিক করে এবং "সাবধানী পরিবর্তন" সম্পাদনা ইভেন্টটিকে আপনার সাবক্লাস ইউনিটে টেনে আনার মাধ্যমেও করা যেতে পারে।

ইউআইটিেক্সটফিল্ড পরিবর্তন ইভেন্ট


2
এটি সহজ হতে পারে তবে সন্ধানের 10-15 মিনিটের পরে, আমি আপনার উত্তরটি সুযোগে হোঁচট খাওয়ার আগে পর্যন্ত এই সম্ভাবনাটি আবিষ্কার করতে পারি নি। আমার কাছ থেকে আরও একটি +1 করুন; কোড-ভিত্তিক এবং আইবি-ভিত্তিক সমাধান উভয়ই এই জাতীয় প্রশ্নের পক্ষে খুব বেশি ভোট দেওয়া ভাল।
মার্ক আমেরিকা

আমি মাত্র 6.3 এ এটি পরীক্ষা করেছিলাম এবং এটি সেখানে রয়েছে। এটি একটি ইউআইটিেক্সটভিউ এবং এটিতে ডান ক্লিক করুন এবং "সম্পাদনা পরিবর্তিত" দেখুন।
উইলিয়াম টি

4
পৃথিবীতে কেন এটির নামকরণ করা হয় সম্পাদনা বদলানো ?? পাগল! যদিও সমাধানের জন্য ধন্যবাদ :-)
ম্যালহাল

3
কারণ ইভেন্টগুলি সম্পাদনা করার সময় বলা হয়, যখন পাঠ্যক্ষেত্র সম্পাদনা শেষ করে অর্থাৎ প্রথম প্রতিক্রিয়াকারীকে পদত্যাগ করে যখন মান পরিবর্তন হয় ged UITextFieldTextDidChangeNotifications হ'ল একটি UITextFeld বিজ্ঞপ্তি, যখন UIControlEventValueChanged ইউআইসিএনট্রোল দ্বারা প্রয়োগ করা হয় যা ইউআইবাটন সাবক্লাসগুলি।
ক্যামসফট

2
আমি লক্ষ্য করেছি যে এটি পাঠ্যক্ষেত্রের বাইরে ব্যবহারকারী ট্যাব হিসাবে কাজ করে না এবং একটি স্ব-সংশোধন পাঠ্য সামগ্রীটিকে প্রতিস্থাপন করে
অগভীর

136

ইভেন্ট শ্রোতা সেট করতে:

[self.textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];

আসলে শুনতে:

- (void)textFieldDidChange:(UITextField *)textField {
    NSLog(@"text changed: %@", textField.text);
}

শীতল। আমি এই পদ্ধতির পছন্দ করি, কারণ আমি ভিউকন্ট্রোলার বেস ক্লাসে টেক্সটফিল্ড-পরিবর্তন-শ্রবণটি প্রয়োগ করতে চাই যা ইতিমধ্যে টেক্সটফিল্ডডেলিগেট। এইভাবে আমি যুক্ত করতে পারি: মন্ত্রের মতো বেসকন্ট্রোলারমঠোড (সাবউভিউগুলিতে টেক্সটফিল্ড)। ধন্যবাদ!
এইচবিবলিটজ

87

সুইফট:

yourTextfield.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)

তারপরে, কলব্যাক ফাংশনটি প্রয়োগ করুন:

@objc func textFieldDidChange(textField: UITextField){

print("Text changed")

}

2
আমার জন্য পরিশ্রমী, আমি ইতিমধ্যে এটি চেষ্টা করেছিলাম কিন্তু বুঝতে পারিনি যে কার্যটির জন্য একটি পাঠ্য ফিল্ড যুক্তি দরকার needed যদি এটি আপনার পক্ষে কাজ করে না, তবে নিশ্চিত হয়ে নিন যে আপনার নির্বাচকটির পাঠ্য ফিল্ডটি পাস করার জন্য একটি যুক্তি রয়েছে (আপনি এটি ব্যবহার না করেও)।
werm098

পাঠ্য ফিল্ডের আগে পাঠ্য ফিল্ডের পূর্বে _ যুক্ত করুন: এইভাবে ফান্ট পাঠ্যফিল্ডডড চ্যাঞ্জ করুন (পাঠ্যফিল্ড: ইউআইটিেক্সটফিল্ড) {...}
মাকালেলে

30

এখানে যেমন বলা হয়েছে: ইউআইটিেক্সটফিল্ড পাঠ্য পরিবর্তনের ইভেন্ট হিসাবে মনে হচ্ছে আইওএস ((আইওএস .0.০ এবং checked.১ পরীক্ষা করা হয়েছে) UITextFieldকেবলমাত্র পর্যবেক্ষণ করে বস্তুর পরিবর্তনগুলি পুরোপুরি সনাক্ত করা সম্ভব নয়UITextFieldTextDidChangeNotification

দেখে মনে হচ্ছে যে বিল্ট-ইন আইওএস কীবোর্ড দ্বারা সরাসরি করা পরিবর্তনগুলি এখনই ট্র্যাক করা হয়েছে। এর অর্থ হ'ল আপনি যদি UITextFieldকেবলমাত্র এরকম কিছু শুরু করে নিজের অবজেক্টটি পরিবর্তন করেন : myUITextField.text = @"any_text"আপনাকে কোনও পরিবর্তন সম্পর্কে অবহিত করা হবে না।

আমি জানি না এটি কোনও ত্রুটিযুক্ত বা এটি উদ্দেশ্যযুক্ত কিনা। আমি কোনও ডকুমেন্টেশনে কোনও যুক্তিসঙ্গত ব্যাখ্যা না পাওয়ায় বাগের মতো মনে হচ্ছে। এটি এখানেও বলা হয়েছে: ইউআইটিেক্সটফিল্ড পাঠ্য পরিবর্তন ইভেন্ট

আমার এটির "সমাধান" হ'ল আমার নিজের প্রতিটি পরিবর্তনের জন্য নিজের দ্বারা একটি বিজ্ঞপ্তি পোস্ট করা UITextField(যদি অন্তর্নিহিত আইওএস কীবোর্ডটি ব্যবহার না করে যদি সেই পরিবর্তনটি করা হয়)। এটার মতো কিছু:

myUITextField.text = @"I'm_updating_my_UITextField_directly_in_code";

NSNotification *myTextFieldUpdateNotification  = 
  [NSNotification notificationWithName:UITextFieldTextDidChangeNotification
                  object:myUITextField];

[NSNotificationCenter.defaultCenter 
  postNotification:myTextFieldUpdateNotification];

এইভাবে আপনি 100% আত্মবিশ্বাসী যে আপনি যখন নিজের .textসম্পত্তি পরিবর্তন করবেন তখন আপনি একই বিজ্ঞপ্তিটি পাবেনUITextField যখন আপনার কোডটিতে "ম্যানুয়ালি" আপডেট করেন বা বিল্ট-ইন আইওএস কীবোর্ডের মাধ্যমে আপনি বস্তুর ।

এটি বিবেচনা করা জরুরী যেহেতু এটি কোনও নথিভুক্ত আচরণ নয়, এই পদ্ধতির ফলে আপনার UITextFieldঅবজেক্টে একই পরিবর্তনের জন্য 2 টি বিজ্ঞপ্তি পেতে পারে । আপনার প্রয়োজনগুলির উপর নির্ভর করে (আপনি যখন UITextField.textপরিবর্তনগুলি আসলে কী করেন ) এটি আপনার অসুবিধা হতে পারে।

কিছুটা ভিন্ন দৃষ্টিভঙ্গি হ'ল একটি কাস্টম বিজ্ঞপ্তি পোস্ট করা (এটি হ'ল ব্যতীত একটি কাস্টম নামের সাথে UITextFieldTextDidChangeNotification) যদি আপনার সত্যিকারের বিজ্ঞপ্তিটি আপনার বা "আইওএস-তৈরি" ছিল কিনা তা জানতে হবে।

সম্পাদনা করুন:

আমি সবেমাত্র একটি ভিন্ন পদ্ধতির সন্ধান করেছি যা আমি মনে করি এটি আরও ভাল হতে পারে:

এর মধ্যে উদ্দেশ্য-সি এর মূল-মান পর্যবেক্ষণ (কেভিও) বৈশিষ্ট্য অন্তর্ভুক্ত রয়েছে ( http://developer.apple.com/library/ios/#docamentation/cocoa/conceptual/KeyValueObserving/KeyValueOserving.html#//apple_ref/doc/uid / 10000177-বিসিআইকিজেডিএএ )।

মূলত, আপনি কোনও সম্পত্তির পর্যবেক্ষক হিসাবে নিজেকে নিবন্ধিত করুন এবং যদি এই সম্পত্তিটি পরিবর্তন হয় তবে আপনাকে সে সম্পর্কে অবহিত করা হবে। "নীতি "টি কীভাবে NSNotificationCenterকাজ করে তার সাথে বেশ মিল , এই আইওএস 6 এর মতো স্বয়ংক্রিয়ভাবে কাজ করার প্রধান সুবিধা হ'ল (ম্যানুয়ালি বিজ্ঞপ্তি পোস্ট করার মতো কোনও বিশেষ ঝাঁকুনি ছাড়াই)।

আমাদের-পরিস্থিতিটির জন্য UITextFieldএটি ঠিক কাজ করে যদি আপনি এই কোডটি যুক্ত করেন, উদাহরণস্বরূপ, UIViewControllerএতে আপনার পাঠ্য ক্ষেত্র রয়েছে:

static void *myContext = &myContext;

- (void)viewDidLoad {
  [super viewDidLoad];

  //Observing changes to myUITextField.text:
  [myUITextField addObserver:self forKeyPath:@"text"
    options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld 
    context:myContext];

}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object 
change:(NSDictionary *)change context:(void *)context {

  if(context == myContext) {
    //Here you get notified every time myUITextField's "text" property is updated
    NSLog(@"New value: %@ - Old value: %@",
      [change objectForKey:NSKeyValueChangeNewKey],
      [change objectForKey:NSKeyValueChangeOldKey]);
  }
  else 
    [super observeValueForKeyPath:keyPath ofObject:object 
      change:change context:context];

}

"প্রসঙ্গ" পরিচালনা সম্পর্কিত এই উত্তরের কৃতিত্ব: https://stackoverflow.com/a/12097161/2078512

নোট: মত যখন তুমি মনে প্রক্রিয়ায় একটি সম্পাদনা UITextFieldটাইপ / সরিয়ে বিল্ট-ইন আইওএস কীবোর্ড, টেক্সট ক্ষেত্রের 'টেক্সট' সম্পত্তি প্রতিটি নতুন অক্ষর দিয়ে আপডেট করা হয় না। পরিবর্তে, আপনি পাঠ্য ক্ষেত্রের প্রথম প্রতিক্রিয়াশীল স্থিতির পদত্যাগ করার পরে পাঠ্য ক্ষেত্রের অবজেক্টটি "সামগ্রিকভাবে" আপডেট হয়।


5
কেন নিজেকে এটিকে সামনে রেখেছেন, জেনেলিমেন্টের উত্তর থেকে কেবল লক্ষ্য-ক্রিয়া পদ্ধতিটি ব্যবহার করুন। আপনার যদি দশমো কোডের লাইনের দরকার হয় তবে এমন কিছু করুন যা "সরল" হওয়া উচিত, আপনি সম্ভবত এটি ভুল করছেন।
jrturton

6
এটি উদ্দেশ্যমূলক আচরণ বলে মনে হবে। কোড দ্বারা উত্পন্ন ইভেন্টগুলির জন্য অন্য কোনও প্রতিনিধি পদ্ধতি (যেমন স্ক্রোলিং, নির্বাচন) কল করা হবে না।
jrturton

1
নোট করুন যে UIKit কেভিও অনুগত হওয়ার গ্যারান্টিযুক্ত নয় , সুতরাং কেভিও দ্রষ্টব্য প্রয়োজনীয়ভাবে কাজ করবে না।
পাইং

@ জার্টুরটন, আপনার "কেন" প্রশ্ন সম্পর্কিত, এটি সম্পূর্ণ সাধারণ বিষয় যে অন্য কোনও শ্রেণিতে (সম্ভবত কোনও সাজসজ্জা, অ্যানিমেশন বা এর মতো) আপনার পাঠ্য ক্ষেত্রে কী ঘটছে তার প্রতিক্রিয়া জানাতে হবে।
ফ্যাটি

27

আমরা এটি থেকে সহজেই কনফিগার করতে পারি Storyboard, সিটিআরএল @IBActionএটিকে টেনে আনুন এবং ইভেন্টটিকে নিম্নলিখিত হিসাবে পরিবর্তন করুন:

এখানে চিত্র বর্ণনা লিখুন


14

এখানে একই জন্য দ্রুত সংস্করণ।

textField.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged)

func textFieldDidChange(textField: UITextField) {

}

ধন্যবাদ


12

আমিChageChractersInRange এর আচরণ পরিবর্তন করে বিষয়টি সমাধান করেছি। আপনি যদি কোনও ফেরত দেন তবে পরিবর্তনগুলি আইওএস দ্বারা অভ্যন্তরীণভাবে প্রয়োগ করা হবে না, পরিবর্তে আপনার নিজের হাতে নিজেই এটি পরিবর্তন করার এবং পরিবর্তনের পরে কোনও ক্রিয়া সম্পাদনের সুযোগ রয়েছে।

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    //Replace the string manually in the textbox
    textField.text = [textField.text stringByReplacingCharactersInRange:range withString:string];
    //perform any logic here now that you are sure the textbox text has changed
    [self didChangeTextInTextField:textField];
    return NO; //this make iOS not to perform any action
}

3
এই সমাধানটির সাথে সমস্যাটি হ'ল: কার্সার অবস্থানটি ক্ষেত্রের সমাপ্তিতে সেট হয়ে যায় (আপনি পাঠ্যফিল্ড.টেক্সট = ... এর সাথে সাথেই)। সুতরাং ব্যবহারকারী যদি ক্ষেত্রের মাঝখানে অক্ষরগুলি সম্পাদনা করতে চান তবে প্রতিটি কীস্ট্রোকের সাথে তাদের কার্সারটি ক্ষেত্রের শেষ প্রান্তে চলে যাবে। চেষ্টা করে দেখুন।
ফ্রান্ট্রিক রক

অ্যালেক্স @ অ্যালেক্স, তবে প্রায় কাজ করা সহজ। কেবলমাত্র একটি স্থানীয় এনএসএসআরটিংয়ের ফলাফল হিসাবে গণনা করুন এবং এটি আপনার ড্যাড চ্যাঞ্জটেক্সটআইটেক্সটফিল্ড: টু টেক্সট: পদ্ধতিতে পাস করুন, তারপরে আইওএসকে আপডেটটি সম্পাদন করতে দিতে হ্যাঁ ফিরিয়ে দিন।
jk7

11

সুইফট সংস্করণ পরীক্ষা করা হয়েছে:

//Somewhere in your UIViewController, like viewDidLoad(){ ... }
self.textField.addTarget(
        self, 
        action: #selector(SearchViewController.textFieldDidChange(_:)),
        forControlEvents: UIControlEvents.EditingChanged
)

প্যারামিটারগুলি ব্যাখ্যা করেছে:

self.textField //-> A UITextField defined somewhere in your UIViewController
self //-> UIViewController
.textFieldDidChange(_:) //-> Can be named anyway you like, as long as it is defined in your UIViewController

তারপরে আপনি উপরে তৈরি পদ্ধতিটি এতে যুক্ত করুন UIViewController:

//Gets called everytime the text changes in the textfield.
func textFieldDidChange(textField: UITextField){

    print("Text changed: " + textField.text!)

}

7

সুইফট 4

func addNotificationObservers() {

    NotificationCenter.default.addObserver(self, selector: #selector(textFieldDidChangeAction(_:)), name: .UITextFieldTextDidChange, object: nil)

}

@objc func textFieldDidChangeAction(_ notification: NSNotification) {

    let textField = notification.object as! UITextField
    print(textField.text!)

}

5

সুইফট ৩.০ এর জন্য:

let textField = UITextField()

textField.addTarget(
    nil,
    action: #selector(MyClass.textChanged(_:)),
    for: UIControlEvents.editingChanged
)

ক্লাস যেমন ব্যবহার করে:

class MyClass {
    func textChanged(sender: Any!) {

    }
}

4

সুইফট 3 সংস্করণ

yourTextField.addTarget(self, action: #selector(YourControllerName.textChanges(_:)), for: UIControlEvents.editingChanged)

এবং এখানে পরিবর্তন পেতে

func textChanges(_ textField: UITextField) {
    let text = textField.text! // your desired text here
    // Now do whatever you want.
}

আশা করি এটা সাহায্য করবে.


2

এই সমস্যাটি সমাধান করার জন্য আপনার বিজ্ঞপ্তিটি ব্যবহার করা উচিত, কারণ অন্য পদ্ধতিটি ইনপুট বাক্সটি শুনবে প্রকৃত ইনপুট নয়, বিশেষত যখন আপনি চাইনিজ ইনপুট পদ্ধতি ব্যবহার করেন use ভিউডিডলোডে

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFiledEditChanged:)
                                                 name:@"UITextFieldTextDidChangeNotification"
                                               object:youTarget];

তারপর

- (void)textFiledEditChanged:(NSNotification *)obj {
UITextField *textField = (UITextField *)obj.object;
NSString *toBestring = textField.text;
NSArray *currentar = [UITextInputMode activeInputModes];
UITextInputMode *currentMode = [currentar firstObject];
if ([currentMode.primaryLanguage isEqualToString:@"zh-Hans"]) {
    UITextRange *selectedRange = [textField markedTextRange];
    UITextPosition *position = [textField positionFromPosition:selectedRange.start offset:0];
    if (!position) {
        if (toBestring.length > kMaxLength)
            textField.text =  toBestring;
} 

}

অবশেষে, আপনি চালান, সম্পন্ন হবে।


2

সুইফট ৩.১:

নির্বাচক: ClassName.MethodName

  cell.lblItem.addTarget(self, action: #selector(NewListScreen.fieldChanged(textfieldChange:)), for: .editingChanged)

  func fieldChanged(textfieldChange: UITextField){

    }

2

সুইফট 3 সংস্করণ:

class SomeClass: UIViewController, UITextFieldDelegate { 

   @IBOutlet weak var aTextField: UITextField!


    override func viewDidLoad() {
        super.viewDidLoad()

        aTextField.delegate = self
        aTextField.addTarget(self, action: #selector(SignUpVC.textFieldDidChange), for: UIControlEvents.editingChanged)        
    }

   func textFieldDidChange(_ textField: UITextField) {

       //TEXT FIELD CHANGED..SECRET STUFF

   }

}

প্রতিনিধি সেট করতে ভুলবেন না।


আমার ভিউ কন্ট্রোলারে আমার কাছে 6 টি পাঠ্য ক্ষেত্র রয়েছে এবং আমি কেবলমাত্র শেষের পাঠ্য ক্ষেত্রটি মুদ্রণ পরিবর্তন করা হয়েছে কিনা তা পরীক্ষা করতে চাই ("শেষ পাঠের ক্ষেত্রটি পরিবর্তন করা হয়েছে!") আপনি কী সহায়তা করতে পারেন?
সাইদ রহমাতলাহী

প্রথমে আপনার টেক্সটফিল্ডের জন্য আইবলেটলেট তৈরি করুন। তারপরে ডেলিগেটটি সেট করুন এবং আমি আমার উত্তরে দেখিয়েছি এমন অ্যাডগার্ট করুন। ডেলিগেট ফাংশন টেক্সটফিল্ডডিড চেঞ্জে, এটি যুক্ত করুন: "যদি পাঠ্যফিল্ড == আপনারলাস্টেক্সটফিল্ড {মুদ্রণ করুন (" সর্বশেষ পাঠ্য ক্ষেত্রটি পরিবর্তন করা হয়েছে! ")} এখনই আমার কম্পিউটারে অ্যাক্সেস নেই আমার যখন এই মন্তব্যটি আরও পাঠযোগ্য হবে তখন আমি এই মন্তব্যটি আরও পাঠযোগ্য আমার কম্পিউটারে
জোসেফ ফ্রান্সিস

2

বন্ধ সহ:

   class TextFieldWithClosure: UITextField {
    var targetAction: (() -> Void)? {
        didSet {
            self.addTarget(self, action: #selector(self.targetSelector), for: .editingChanged)
        }
    }

    func targetSelector() {
        self.targetAction?()
    }
    }

এবং ব্যবহার

textField.targetAction? = {
 // will fire on text changed
 }

2
  1. কেভিও সলিউশনগুলি কাজ করে না

নিয়ন্ত্রণের জন্য কেভিও আইওএসে কাজ করে না: http://stackoverflow.com/a/6352525/1402846 https://developer.apple.com/library/archive/docamentation/ জেনারেল / কনসেপ্টুয়াল / ডেভপিডিয়া- কোকো কোর / কেভিও html

  1. পর্যবেক্ষক শ্রেণিতে, আপনি এটি করেন:

আপনি যে পাঠ্য দর্শনটি দেখতে চান তা জানেন:

var watchedTextView: UITextView!

এটা কর:

NotificationCenter.default.addObserver(
    self,
    selector: #selector(changed),
    name: UITextView.textDidChangeNotification,
    object: watchedTextView)

তবে এর সাথে সাবধান থাকুন:

  • সম্ভবত আপনি কেবল একবার কল করতে চান , সুতরাং এটি কল করবেন না, উদাহরণস্বরূপ,layoutSubviews

  • আপনার আনার প্রক্রিয়া চলাকালীন কখন এটিকে সেরা কল করা উচিত তা জানা বেশ কঠিন। এটি আপনার পরিস্থিতির উপর নির্ভর করবে। দুর্ভাগ্যক্রমে কোনও স্ট্যান্ডার্ড, লক-ইন সমাধান নেই

  • উদাহরণস্বরূপ আপনি সাধারণত অবশ্যই এটি সময়ে কল করতে পারবেন নাinit , যেহেতু অবশ্যই watchedTextViewউপস্থিত থাকতে পারে না

  1. পরের সমস্যাটি হ'ল ...

প্রোগ্রামটিমেটিকভাবে টেক্সট পরিবর্তন করা হলে কোনও বিজ্ঞপ্তি কল করা হয় না ।

এটি আইওএস ইঞ্জিনিয়ারিংয়ে একটি বিশাল, বয়সের এবং মূ .়, উপদ্রব।

কন্ট্রোলগুলি কেবল কাহিনীটির শেষ হয় না - যখন পাঠ্য সম্পত্তিটি প্রোগ্রামক্রমে পরিবর্তন করা হয় তখন বিজ্ঞপ্তিগুলিকে কল করুন।

অবশ্যই এটি অত্যন্ত বিরক্তিকর - অবশ্যই - প্রতিটি অ্যাপ্লিকেশন তৈরি করে পাঠ্যটিকে প্রোগ্রাম্যাটিকভাবে সেট করে, যেমন ব্যবহারকারীর পোস্টগুলির পরে ক্ষেত্র সাফ করা ইত্যাদি etc.

আপনাকে পাঠ্য দর্শন (বা অনুরূপ নিয়ন্ত্রণ) এর মতো সাবক্লাস করতে হবে:

class NonIdioticTextView: UIITextView {

    override var text: String! {
        // boilerplate code needed to make watchers work properly:
        get {
            return super.text
        }
        set {
            super.text = newValue
            NotificationCenter.default.post(
                name: UITextView.textDidChangeNotification,
                object: self)
        }

    }

}

(টিপ - সুপার কল আগে আসতে হবে ভুলবেন না ! পোস্ট কল।)

সেখানে নেই যদি না, আপনি শুধু উপরে দেখানো subclassing নিয়ন্ত্রণ ঠিক, সমাধান পাওয়া যায়। যে শুধুমাত্র সমাধান।

নোটিফিকেশন নোট করুন

UITextView.textDidChangeNotification

ফলাফল স্বরূপ

func textViewDidChangeSelection(_ textView: UITextView) 

বলা হচ্ছে.

( না textViewDidChange ।)


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



- (void) didChangeTextViewText {
 //do something
}

0

একটি জিনিস আপনার একাধিক ইউআইটিেক্সটফিল্ড থাকতে পারে। সুতরাং, তাদের একটি ট্যাগ দিন এবং তারপরে আপনি ট্যাগগুলি স্যুইচ করতে পারেন। যে কোনও শ্রেণিতে পর্যবেক্ষককে সেটআপ করার পদ্ধতিটি এখানে বেশ কয়েকটি।

private func setupTextFieldNotification() {
    NotificationCenter.default.addObserver(forName: UITextField.textDidChangeNotification, object: nil, queue: OperationQueue.main) { (notification) in
        if let textField = notification.object as? UITextField, textField.tag == 100, let text = textField.text {
            print(#line, text)
        }
    }
}

deinit {
    NotificationCenter.default.removeObserver(self)
}

-1

সুইফট 4 সংস্করণ

কী-মান পর্যবেক্ষণ ব্যবহার করে অন্যান্য বস্তুর বৈশিষ্ট্যগুলিতে পরিবর্তনগুলি সম্পর্কে অবহিতকে অবহিত করুন।

var textFieldObserver: NSKeyValueObservation?

textFieldObserver = yourTextField.observe(\.text, options: [.new, .old]) { [weak self] (object, changeValue) in
  guard let strongSelf = self else { return }
  print(changeValue)
}

ভাল ধারণা. আপনি কি এটিকে একটি প্রসঙ্গে গুটিয়ে রাখতে পারেন এবং আমাদের জানান?
রেভান্থ কৌশিকান

1
দুর্ভাগ্যক্রমে, এটি সম্পূর্ণ ভুল। KVO নিয়ন্ত্রণের জন্য আইওএস কাজ করে না: stackoverflow.com/a/6352525/1402846 developer.apple.com/library/archive/documentation/General/...
Fattie
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.