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




objective-c swift (15)

मैं टेक्स्ट फ़ील्ड में किसी भी टेक्स्ट परिवर्तन का पता कैसे लगा सकता हूं? प्रतिनिधि विधि को shouldChangeCharactersInRange कुछ के लिए काम करता है, लेकिन यह मेरी ज़रूरत को पूरा नहीं करता है। चूंकि यह यस लौटाता है, तब तक टेक्स्टफिल्ल्ड ग्रंथ अन्य पर्यवेक्षक विधियों के लिए उपलब्ध नहीं हैं।

उदाहरण के लिए मेरे कोड की calculateAndUpdateTextFields औरUpdateTextFields को अद्यतन पाठ नहीं मिला, उपयोगकर्ता ने टाइप किया है।

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

@IBAction func textfildChange(sender: UITextField) {
        if let number = sender.text {
            if number.isEmpty {

            } else {
               print(number)
            }
        }
    }

स्विफ्ट 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

   }

}

प्रतिनिधि को सेट करना न भूलें।


स्विफ्ट 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.
}

आशा करता हूँ की ये काम करेगा।


बंद होने के साथ:

   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
 }

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


घटना श्रोता सेट करने के लिए:

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

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

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

यूटेक्स्टफील्ड टेक्स्ट बदलने के उचित तरीके से कॉल वापस कॉल करें :

मैं UITextField नियंत्रण में भेजे गए अक्षरों को इस तरह कुछ पकड़ता हूं:

// Add a "textFieldDidChange" notification method to the text field control.
[textField addTarget:self 
              action:@selector(textFieldDidChange:) 
    forControlEvents:UIControlEventEditingChanged];

फिर टेक्स्ट फ़ील्डडिड चेंज में: विधि आप टेक्स्ट फ़ील्ड की सामग्री की जांच कर सकते हैं, और आवश्यकतानुसार अपने टेबल व्यू को पुनः लोड कर सकते हैं।

आप इसका उपयोग कर सकते हैं और अपने selector रूप में गणना औरUpdateTextFields डाल सकते हैं।


स्विफ्ट:

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

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

@objc func textFieldDidChange(textField: UITextField){

print("Text changed")

}

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

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

यहां के लिए तेज़ संस्करण में।

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

func textFieldDidChange(textField: UITextField) {

}

धन्यवाद


स्विफ्ट 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!)

}

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

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

}

अंत में, आप भाग लेंगे, किया जाएगा।


XenElement का जवाब स्पॉट पर है।

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


स्विफ्ट 3.1:

चयनकर्ता: ClassName.MethodName

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

  func fieldChanged(textfieldChange: UITextField){

    }

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



- (void) didChangeTextViewText {
 //do something
}




uitextfielddelegate