UITextField पाठ परिवर्तन घटना


563

मैं टेक्स्ट टेक्स्ट में किसी भी पाठ परिवर्तन का पता कैसे लगा सकता हूं? प्रतिनिधि विधि shouldChangeCharactersInRangeकुछ के लिए काम करती है, लेकिन इसने मेरी आवश्यकता को पूरा नहीं किया। जब तक यह YES नहीं लौटता, तब तक TextField ग्रंथ अन्य पर्यवेक्षक विधियों के लिए उपलब्ध नहीं हैं।

जैसे मेरे कोड 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 वोटों के साथ एसओ उत्तर का एक अच्छा उदाहरण है जो पूरी तरह से गलत है । iOS मुश्किल है, सूक्ष्म है, और गेटाकास से भरा है।
फेटी

जवाबों:


1056

से उचित तरीके से पाठ परिवर्तन कॉल बैक uitextfield करने के लिए :

मैं 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
यह बेहतर उपाय है - क्योंकि आप इसे Nibs या स्टोरीबोर्ड में भी सेट कर सकते हैं, और आपको अत्यधिक UITextFieldTextDidChangeNotification कोड
पोस्टकोडिज़्म

3
एक ही मुद्दा है। (UITextField *) textfield shouldChangeCharactersInRange: (NSRange) रेंज replacementString: (NSString *) स्ट्रिंग (bool) textfield - यह नहीं के साथ एक साथ मेरे लिए काम करता है
iWheelBuy

4
@iWheelBuy केवल जब यह लौटाता है NO, जो तार्किक है, क्योंकि जब आप NOइस विधि से लौटते हैं , तो आप मूल रूप से कह रहे हैं कि क्षेत्र में पाठ को बदलना नहीं चाहिए।
गीताकार

2
यह परिवर्तन के कारण संपादन के लिए बहुत अच्छा है। यह प्रोग्रामेटिक परिवर्तनों को नहीं पकड़ता है जो इसके माध्यम से होते हैं textField.text = "Some new value";:। क्या इसे पकड़ने का कोई चतुर तरीका है?
बेंजोय

10
आपने Apple के साथ सोचा होगा UITextFieldDelegateकि ऐसा कुछ func textField: UITextField, didChangeText text: Stringशामिल किया गया होगा, लेकिन ... (Apple में लोगों को एक गंदा रूप देता है)
Brandon A

394

XenElement का जवाब हाजिर है।

ऊपर इंटरफेस बिल्डर में भी UITextField पर राइट-क्लिक करके और "उप-परिवर्तन इकाई को" एडिटिंग चेंजेड "ईवेंट को खींचकर किया जा सकता है।

UITextField Change Event


2
यह आसान हो सकता है, लेकिन 10-15 मिनट की खोज के बाद, मैंने इस संभावना की खोज तब तक नहीं की थी जब तक कि आपके उत्तर पर संयोग से ठोकर नहीं लगती। मुझ से एक और +1 करो; कोड-आधारित और IB- आधारित समाधान दोनों को इस तरह के प्रश्नों पर अत्यधिक मतदान करना अच्छा लगता है।
मार्क अमेरी जूल

मैं सिर्फ 6.3 में जाँच की और यह वहाँ है। यह एक UITextView है और इस पर राइट क्लिक करें और "एडिटिंग चेंज" देखें।
विलियम टी।

4
पृथ्वी पर इसका नाम एडिटिंग चेंज क्यों है ?? पागल! हालांकि समाधान के लिए धन्यवाद :-)
मल्हार

3
क्योंकि परिवर्तन को संपादित करते समय ईवेंट को बुलाया जाता है, जबकि वैल्यू चेंज तब होता है जब टेक्स्टफील्ड संपादन समाप्त कर लेता है अर्थात पहले उत्तरदाता से इस्तीफा दे देता है। UITextFieldTextDidChangeNotification एक UITextField सूचना है, जबकि UIControlEventValueChanged UIControl द्वारा कार्यान्वित किया जाता है जिसे UIButton उपवर्ग बनाता है।
कैंसॉफ्ट

2
मुझे लगता है कि यह
टेक्स्टफ़ील्ड के

136

ईवेंट श्रोता सेट करने के लिए:

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

वास्तव में सुनने के लिए:

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

ठंडा। मुझे यह दृष्टिकोण पसंद है, क्योंकि मैं एक ViewController बेस क्लास में TextField-change-Listen को लागू करना चाहता हूं जो पहले से ही TextFieldDelegate है। इस तरह मैं AddTarget कर सकता हूं: एक आकर्षण की तरह BaseControllerMethod (सबवूड में टेक्स्टफिल्ड) के लिए। धन्यवाद!
HBublitz

87

स्विफ्ट:

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

फिर, कॉलबैक फ़ंक्शन लागू करें:

@objc func textFieldDidChange(textField: UITextField){

print("Text changed")

}

2
मेरे लिए काम किया, मैंने पहले से ही यह कोशिश की थी लेकिन यह महसूस नहीं किया कि फ़ंक्शन को टेक्स्टफीड तर्क की आवश्यकता है। यदि यह आपके लिए काम नहीं कर रहा है, तो यह सुनिश्चित कर लें कि आपके चयनकर्ता के पास टेक्स्टफिल्ड को पास करने का तर्क है (भले ही आप इसका उपयोग न करें)।
werm098

TextField में पाठ से पहले जोड़ें। इस तरह से
FFieldDidChange

30

जैसा कि यहां कहा गया है: UITextField पाठ परिवर्तन घटना , ऐसा लगता है कि iOS 6 (iOS 6.0 और 6.1 की जाँच की गई) के रूप में UITextFieldकेवल वस्तुओं के परिवर्तनों का पूरी तरह से पता लगाना संभव नहीं है UITextFieldTextDidChangeNotification

ऐसा लगता है कि केवल अंतर्निहित iOS कीबोर्ड द्वारा सीधे किए गए उन परिवर्तनों को अभी ट्रैक किया गया है। इसका मतलब यह है कि यदि आप UITextFieldकिसी वस्तु को इस तरह से बदलकर अपनी वस्तु को बदलते हैं : myUITextField.text = @"any_text"तो आपको किसी भी बदलाव के बारे में सूचित नहीं किया जाएगा।

मुझे नहीं पता कि यह बग है या इसका इरादा है। एक बग की तरह लगता है क्योंकि मुझे प्रलेखन में कोई उचित स्पष्टीकरण नहीं मिला है। यह यहाँ भी कहा गया है: UITextField text change event

इसका मेरा "समाधान" वास्तव में मेरे द्वारा किए गए हर परिवर्तन के लिए स्वयं द्वारा एक अधिसूचना पोस्ट करना है UITextField(यदि वह परिवर्तन अंतर्निहित iOS कीबोर्ड का उपयोग किए बिना किया जाता है)। कुछ इस तरह:

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यदि आप वास्तव में यह जानना चाहते हैं कि क्या नोटिफिकेशन आपका था या "iOS-made" तो कस्टम नोटिफिकेशन पोस्ट करने के लिए थोड़ा अलग तरीका होगा (यह एक कस्टम नाम के अलावा है )।

संपादित करें:

मुझे बस एक अलग दृष्टिकोण मिला है जो मुझे लगता है कि बेहतर हो सकता है:

इसमें ऑब्जेक्टिव-सी ( http://developer.apple.com/library/ios/#documentation/cocoa/conceptual/KeyValueObserves/KeyalalueObserves.html#//apple_ref/doc/uid ) का मुख्य-मान अवलोकन (KVO) सुविधा शामिल है / 10000177-बीसीआईसीजेडएचए )।

मूल रूप से, आप खुद को एक संपत्ति के पर्यवेक्षक के रूप में पंजीकृत करते हैं और यदि यह संपत्ति बदलती है तो आपको इसके बारे में सूचित किया जाता है। "सिद्धांत" काफी हद तक इसी तरह NSNotificationCenterकाम करता है, मुख्य लाभ यह है कि यह दृष्टिकोण स्वचालित रूप से iOS 6 के रूप में भी काम करता है (बिना किसी विशेष ट्वीक के जैसे कि मैन्युअल रूप से सूचनाएं पोस्ट करने के लिए)।

UITextFieldयदि आप इस कोड को उदाहरण के लिए जोड़ते हैं, तो हमारे -scenario के लिए यह ठीक काम करता है, 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
क्यों अपने आप को इस के माध्यम से रखा, बस XenElement के जवाब से लक्ष्य-एक्शन विधि का उपयोग करें। यदि आपको दसियों लाइनों की आवश्यकता है तो कुछ ऐसा करें जो सरल होने के लिए "चाहिए", आप शायद गलत कर रहे हैं।
jrturton

6
यह अभीष्ट व्यवहार प्रतीत होगा। कोई अन्य प्रतिनिधि विधि (जैसे स्क्रॉल, चयन) कोड द्वारा उत्पन्न घटनाओं के लिए कहा जाता है।
jrturton

1
ध्यान दें कि UIKit केवीओ के अनुरूप होने की गारंटी नहीं है , इसलिए केवीओ समाधान आवश्यक रूप से काम नहीं करेगा।
पैग

@jrturton, आपके "क्यों" प्रश्न के बारे में, यह पूरी तरह से सामान्य है कि किसी अन्य वर्ग (शायद एक सजावट, एनीमेशन या इस तरह) में आपको पाठ क्षेत्र में क्या हो रहा है, इसका जवाब देने की आवश्यकता है।
फेटी

27

हम आसानी से कॉन्फ़िगर कर सकते हैं कि Storyboard, CTRL खींचें @IBActionऔर घटना को निम्नलिखित के रूप में बदलें:

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


14

यहाँ उसी के लिए स्विफ्ट संस्करण में।

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

func textFieldDidChange(textField: UITextField) {

}

धन्यवाद


12

मैंने इस मुद्दे को हल करना चाहा, जिसमें व्यवहार को बदलना चाहिए। यदि आप नहीं लौटाते हैं तो आईओएस द्वारा आंतरिक रूप से परिवर्तन लागू नहीं किए जाएंगे, इसके बजाय आपके पास इसे मैन्युअल रूप से बदलने और परिवर्तनों के बाद किसी भी कार्य को करने का अवसर है।

- (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
इस समाधान के साथ समस्या यह है: कर्सर स्थिति फ़ील्ड के अंत में सेट हो जाती है (जैसे ही आप textField.text = ... करते हैं)। इसलिए यदि उपयोगकर्ता फ़ील्ड के मध्य में वर्णों को संपादित करना चाहता है, तो प्रत्येक कीस्ट्रोक के साथ, उनका कर्सर फ़ील्ड के अंत में जाएगा। यह कोशिश करो और देखो।
FranticRock

अच्छा बिंदु @Alex, लेकिन चारों ओर काम करने के लिए सरल। बस स्थानीय NSString में परिणामी मूल्य की गणना करें और अपने didChangeTextInTextField: toText: पद्धति को पास करें, फिर iOS को अपडेट करने देने के लिए YES लौटाएं।
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

स्विफ्ट 3.0 के लिए:

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

आपको इस समस्या को हल करने के लिए अधिसूचना का उपयोग करना चाहिए, क्योंकि अन्य विधि इनपुट बॉक्स को वास्तव में इनपुट नहीं सुनेंगे, खासकर जब आप चीनी इनपुट पद्धति का उपयोग करते हैं। व्यूडलोड में

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

स्विफ्ट 3.1:

चयनकर्ता: 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 पाठ क्षेत्र हैं और मैं सिर्फ यह जांचना चाहता हूं कि क्या अंतिम पाठ क्षेत्र को प्रिंट बदल दिया गया है ("अंतिम पाठ फ़ील्ड को बदल दिया गया है?") क्या आप मदद कर सकते हैं?
सईद रहमतोलाई

सबसे पहले अपने टेक्स्टफिल्ड के लिए इबौलेट बनाएं। फिर प्रतिनिधि और सेटटार्ग सेट करें जैसे मैंने अपने उत्तर में दिखाया था। प्रतिनिधि फ़ंक्शन में टेक्स्टFieldDidChange में, इसे जोड़ें: "अगर textField == yourLastTextField {print (" अंतिम पाठ फ़ील्ड बदल दिया गया है! ")} अभी मेरे पास मेरे कंप्यूटर तक नहीं है। मैं अपनी टिप्पणी को और अधिक पठनीय बनाऊंगा जब मैं करूँगा। मेरे कंप्यूटर पर जाएं।
जोसेफ फ्रांसिस

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. KVO समाधान काम नहीं करते हैं

KVO नियंत्रणों के लिए iOS में काम नहीं करता है: http://stackoverflow.com/a/6352525/1402846 https://developer.apple.com/library/archive/documentation/General/Conceptual/Devceptedia-CocoaCore/KVO.html

  1. अवलोकन करने वाली कक्षा में, आप ऐसा करते हैं:

यह देखते हुए कि आप वह पाठ दृश्य जानते हैं जिसे आप देखना चाहते हैं:

var watchedTextView: UITextView!

यह करो:

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

हालाँकि, इससे सावधान रहें:

  • यह संभावना है कि आप केवल एक बार कॉल करना चाहते हैं , इसलिए इसे कॉल न करें, उदाहरण के लिए,layoutSubviews

  • यह जान पाना काफी मुश्किल है कि इसे कब लाया जाए। यह आपकी स्थिति पर निर्भर करेगा। दुर्भाग्य से कोई मानक नहीं है, लॉक-इन समाधान

  • उदाहरण के लिए, आप निश्चित रूप से इसे समय पर नहीं कह सकते हैंinit , क्योंकि पाठ्यक्रम watchedTextViewअभी तक मौजूद नहीं हो सकता है

  1. अगली समस्या यह है कि ...

जब प्रोग्राम को प्रोग्रामेटिक रूप से बदला जाता है, तो किसी भी सूचना को नहीं बुलाया जाता है ।

यह आईओएस इंजीनियरिंग में एक बहुत बड़ा, पुराना और मूर्खतापूर्ण उपद्रव है।

नियंत्रण केवल कहानी का अंत नहीं है - .text संपत्ति को प्रोग्रामेटिक रूप से बदलने पर नोटिफ़िकेशन को कॉल करें।

पाठ्यक्रम के कारण यह बहुत ही कष्टप्रद है - जाहिर है - हर ऐप कभी भी प्रोग्राम को व्यवस्थित रूप से सेट करता है, जैसे कि उपयोगकर्ता पोस्ट के बाद फ़ील्ड को साफ़ करना, आदि।

आपको पाठ दृश्य (या समान नियंत्रण) को इस तरह से उप-लिंक करना होगा:

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

    }

}

(टिप - मत भूलना सुपर कॉल से पहले आना होगा ! पोस्ट कॉल)

वहाँ नहीं है जब तक कि, आप के रूप में सिर्फ ऊपर दिखाए गए उपवर्गीकरण द्वारा नियंत्रण ठीक, समाधान उपलब्ध। वही एकमात्र उपाय है।

ध्यान दें कि अधिसूचना

UITextView.textDidChangeNotification

का परिणाम

func textViewDidChangeSelection(_ textView: UITextView) 

बुलाया जाना।

( नहीं textViewDidChange ।)


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



- (void) didChangeTextViewText {
 //do something
}

0

एक बात आप कई UITextFields हो सकता है। तो, उन्हें एक टैग दें और फिर आप टैग पर स्विच कर सकते हैं। यहां बताया गया है कि किसी भी वर्ग में एक पर्यवेक्षक को बहुत अधिक कैसे सेटअप किया जाए।

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 नियंत्रण के लिए iOS में काम नहीं करता है: stackoverflow.com/a/6352525/1402846 developer.apple.com/library/archive/documentation/General/…
Fattie
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.