2011-01-12 16 views
8

मेरे पास एक कस्टम कीबोर्ड है जिसका उपयोग मैं mytextField में टेक्स्ट को संपादित करने के लिए कर रहा हूं और यह बहुत अच्छा काम करता है। हालांकि, मैं अपने कस्टम कीबोर्ड का उपयोग करके निष्पादित करने के लिए कभी भी shouldChangeCharactersInRange प्रतिनिधि नहीं प्राप्त कर सकता। जब मैं अपने वास्तविक कीबोर्ड का उपयोग करता हूं (स्पष्ट रूप से डिफ़ॉल्ट आईफ़ोन कीबोर्ड नहीं, तब से यह निष्पादित होता है क्योंकि मैं mytextField.inputView = numberPad.view सेट करता हूं)। कस्टम कीबोर्ड का उपयोग कर shouldChangeCharactersInRange प्रतिनिधि को आग लगाने के लिए मुझे क्या करना चाहिए? बीटीडब्ल्यू, कस्टम कीबोर्ड सिर्फ बटन का एक गुच्छा है।मैं कस्टम इनपुट के साथ आग लगाने के लिए UITextFieldDelegate.ShouldChangeCharactersInRange कैसे प्राप्त कर सकता हूं?

- (void) numberPadPressed: (UIButton *)sender { 
    [mytextField insertText:[[NSNumber numberWithInt:sender.tag] stringValue]]; 
} 

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { 
    NSString *resultingString = [textField.text stringByReplacingCharactersInRange: range withString: string]; 
    NSLog(@"shouldChangeCharactersInRange: %@", resultingString); 
    return true; 
} 

- (void)viewDidLoad { 
    mytextField.text = @""; 
    mytextField.inputView = numberPad.view; 
    mytextField.delegate = self; 
    [mytextField becomeFirstResponder]; 
} 

उत्तर

0

संपादित करें: क्षमा करें, पहले अपने प्रश्न को गलत समझा। जब यह प्रणाली कुंजीपटल से इनपुट हो जाता है, तो आप यह निर्धारित करने के पाठ वास्तव में प्रदर्शित करना चाहिए (उदाहरण के लिए आप एक शॉर्टकट समझते हैं और कुछ बड़े टेक्स्ट डालने के लिए इसे लागू कर सकते हैं) का अवसर देने के

आपका पाठ क्षेत्र shouldChangeCharactersInRange कहता है। लेकिन टेक्स्ट फ़ील्ड टेक्स्ट कस्टम इनपुट के रूप में आपके कस्टम व्यू से इनपुट को नहीं पहचानता है।

आप एक कस्टम inputView है, तो आप इस पद्धति को लागू करने की जरूरत नहीं है - अपने IBAction से सीधे बस अद्यतन पाठ क्षेत्र:

- (IBAction) numberPadPressed: (UIButton *)sender { 
    NSString *newText = [[mytextField text] stringByReplacingCharactersInRange:[mytextField selectedRange] withString:string]; 
    [mytextField setText:newText]; 
} 
+0

मैंने अभी उपरोक्त आपके सुझाव का उपयोग करके परीक्षण किया है, लेकिन अभी भी चेंज दबाए जाने पर चेंज चेंजर्स इनरेंज को आग नहीं लगनी चाहिए। मुझे लगता है कि हम सही रास्ते पर हैं ... – docchang

+0

मैं सीमा की गणना कैसे करूं? क्या टेक्स्टफिल्ड में किसी विशेष स्थिति पर कर्सर को स्थानांतरित करने का कोई तरीका है? – docchang

+0

मैंने कोड नमूना अद्यतन किया। चयनित श्रेणी प्राप्त करने के लिए [mytextField चयनित रेंज] का उपयोग करें, यदि कोई चयन न हो तो केवल एक प्रविष्टि बिंदु होगा, या चयन होने पर वर्णों की एक श्रृंखला होगी। –

10

आप shouldChangeCharactersInRange एक कस्टम कीबोर्ड के साथ कहा जाता है कभी नहीं होगा ।

UITextField की घटना UIControlEventEditingChanged क्या हो सकती है। तो shouldChangeCharactersInRange विधि (जो इसके अलावा छोटी गाड़ी के रूप में जाना जाता है) पर भरोसा करने के बजाय, आपको इस घटना पर भरोसा करना चाहिए, जब उपयोगकर्ता टेक्स्ट फ़ील्ड की सामग्री को बदलता है तो उसे निकाल दिया जाएगा।

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

आप अपने आप को अपने कस्टम कीबोर्ड के साथ पाठ क्षेत्र संशोधित करते हैं, सिर्फ घटना UIControlEventEditingChanged के सभी श्रोताओं को सूचित करने के लिए इस विधि कहते हैं।

[textField sendActionsForControlEvents:UIControlEventTouchUpInside]; 
+0

आपके 'forControlEvents' को आपके 'sendActionsForControlEvents' से मेल खाना चाहिए –

0

मैं जानता हूँ कि यह एक पुराने सवाल है, लेकिन मैं पूर्व 5.0 उपकरणों का समर्थन करने की आवश्यकता होगी, में एक ही समस्या में पड़ गए। यदि आप insertText को ओवरराइड करते हैं: रोब से http://dev.ragfield.com/2009/09/insert-text-at-current-cursor-location.html पर निर्देशों का पालन करके आपको हर समय आग लगने के लिए चेंज चेंजएक्टर्स इनरेंज प्राप्त करना होगा।

आप तो जैसे मैं आप How to simulate the delete key on UITextField?

पर @cormacrelf से जवाब का उपयोग कर सकते था backspace कुंजी का समर्थन करने की आवश्यकता है केवल घपला मैं आस-पास काम करने में सक्षम नहीं किया गया है कि जब आप से एक चरित्र को नष्ट है स्ट्रिंग के बीच कर्सर स्ट्रिंग के अंत तक वापस कूदता है।

संबंधित मुद्दे

 संबंधित मुद्दे