2012-06-22 29 views
24

किसी को भी इस के साथ मेरी मदद कर सकते हैं: मैं इनपुट संख्या के लिए UITextField को लागू करने की जरूरत है। यह संख्या हमेशा 4 स्थानों के साथ दशमलव प्रारूप में होना चाहिए उदा। 12.3456 या 12.3400। इसलिए मैंने NSNumberFormatter बनाया जो मुझे दशमलव स्थानों के साथ मदद करता है।अपने मूल्य निर्धारित करने के बाद UITextField में कर्सर ले जाने के लिए कैसे

मैं

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string विधि में UITextField मान सेट कर रहा हूँ। मैं इनपुट इनपुट करता हूं, फॉर्मेटर का उपयोग करता हूं और अंत में [textField setText: myFormattedValue];

यह ठीक काम करता है लेकिन यह कॉल कर्सर को मेरे क्षेत्र के अंत में भी ले जाती है। वह अवांछित है। जैसे मेरे पास मेरे क्षेत्र में 12.3400 है और कर्सर बहुत शुरुआत और उपयोगकर्ता प्रकार संख्या 1 पर स्थित है। परिणाम मान 112.3400 है लेकिन कर्सर अंत में स्थानांतरित हो गया है। जब उपयोगकर्ता अपेक्षा करता है तो मैं कर्सर के साथ समाप्त करना चाहता हूं (केवल हाल ही में जोड़े गए नंबर 1 के बाद)। कर्सर को TextView में सेट करने के बारे में कुछ विषय हैं लेकिन यह UITextField है। मैं भी क्षेत्र है, जो कर्सर की स्थिति को ठीक से बचाता है की selectedTextRange पकड़ने की कोशिश की लेकिन बाद setText विधि कॉल, यह स्वचालित रूप से बदलता है और मूल UITextRange खो (वर्तमान के लिए बदल) कर रहा है। आशा है, मेरी व्याख्या स्पष्ट है।

कृपया, इसके साथ मेरी सहायता करें। आपका बहुत बहुत धन्यवाद।

EDIT: अंत में, मैंने पूर्ण संपादन के बाद प्रारूप को बदलने के लिए कार्यक्षमता को स्विच करने का निर्णय लिया और पर्याप्त काम करता है। मैंने इसे एक चयनकर्ता forControlEvents:UIControlEventEditingDidEnd जोड़कर किया है।

+0

जब आप 'selectedTextRange' पढ़ा, तो आप इसे कक्षा में एक संपत्ति है कि के रूप में' UITextFieldDelegate' में कार्य करता है के रूप में कॉपी नहीं कर सकते और फिर पुनः सेट: मेरे लिए orked बहुत ही सरल है, बस का इस्तेमाल किया प्रेषण मुख्य async था यह 'setText:' के बाद है? –

+1

फिलिप, यह काम नहीं करता है।सेटटेक्स्ट के साथ टेक्स्ट सेट करने के बाद, टेक्स्ट सेट करने से पहले आपके द्वारा एकत्र किए गए UITextRange को शून्य पर रीसेट कर दिया जाता है, और इसलिए आप इसे बाद में समाप्त UITextField पर पुन: लागू नहीं कर सकते हैं। – JasonD

उत्तर

2

कोड इस जवाब में वर्णित लागू: Moving the cursor to the beginning of UITextField

NSRange beginningRange = NSMakeRange(0, 0); 
NSRange currentRange = [textField selectedRange]; 
if(!NSEqualRanges(beginningRange, currentRange)) 
{ 
    [textField setSelectedRange:beginningRange]; 
} 

संपादित करें:this answer से, ऐसा लगता है कि आप केवल आपके iOS 5 या इसके बाद के संस्करण का उपयोग कर रहे हैं यदि आपके UITextField के साथ इस कोड का उपयोग कर सकते लग रहा है। अन्यथा, आपको इसके बजाय UITextView का उपयोग करने की आवश्यकता है।

38

बाद UITextField.text संपत्ति बदल गया है, UITextPosition या UITextRange वस्तुओं के लिए किसी भी पिछले संदर्भ है कि पुराने पाठ के साथ जुड़े थे शून्य पर सेट हो जाएगा आप पाठ गुण सेट के बाद। आपको टेक्स्ट प्रॉपर्टी सेट करने से पहले मैनिपुलेशन के बाद टेक्स्ट ऑफ़सेट क्या होगा, स्टोर करने की आवश्यकता है।

यह मैं हूँ (ध्यान दें, आप परीक्षण करने के लिए है कि क्या cursorOffset < textField.text.length है अगर आप नीचे दिए गए उदाहरण में टी से किसी भी वर्ण निकालने की क्या ज़रूरत है) के लिए काम किया:

- (BOOL) textField:(UITextField *) textField shouldChangeCharactersInRange:(NSRange) range replacementString:(NSString *) string 

{ 
    UITextPosition *beginning = textField.beginningOfDocument; 
    UITextPosition *start = [textField positionFromPosition:beginning offset:range.location]; 
    UITextPosition *end = [textField positionFromPosition:start offset:range.length]; 
    UITextRange *textRange = [textField textRangeFromPosition:start toPosition:end]; 

    // this will be the new cursor location after insert/paste/typing 
    NSInteger cursorOffset = [textField offsetFromPosition:beginning toPosition:start] + string.length; 

    // now apply the text changes that were typed or pasted in to the text field 
    [textField replaceRange:textRange withText:string]; 

    // now go modify the text in interesting ways doing our post processing of what was typed... 
    NSMutableString *t = [textField.text mutableCopy]; 
    t = [t upperCaseString]; 
    // ... etc 

    // now update the text field and reposition the cursor afterwards 
    textField.text = t; 
    UITextPosition *newCursorPosition = [textField positionFromPosition:textField.beginningOfDocument offset:cursorOffset]; 
    UITextRange *newSelectedRange = [textField textRangeFromPosition:newCursorPosition toPosition:newCursorPosition]; 
    [textField setSelectedTextRange:newSelectedRange]; 

    return NO; 
} 
+2

मेरे लिए बहुत अच्छा काम किया। धन्यवाद, जेसनडी! –

+2

पूरी तरह से काम करता है। धन्यवाद!!! – RohinNZ

+0

tnx बहुत अधिक, मैंने आलसी लोगों के लिए नीचे त्वरित संस्करण जोड़ा :) – ergunkocak

3

और यहाँ तेज है संस्करण:

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { 
    let beginning = textField.beginningOfDocument 
    let start = textField.positionFromPosition(beginning, offset:range.location) 
    let end = textField.positionFromPosition(start!, offset:range.length) 
    let textRange = textField.textRangeFromPosition(start!, toPosition:end!) 
    let cursorOffset = textField.offsetFromPosition(beginning, toPosition:start!) + string.characters.count 

// just used same text, use whatever you want :) 
    textField.text = (textField.text! as NSString).stringByReplacingCharactersInRange(range, withString: string) 

    let newCursorPosition = textField.positionFromPosition(textField.beginningOfDocument, offset:cursorOffset) 
    let newSelectedRange = textField.textRangeFromPosition(newCursorPosition!, toPosition:newCursorPosition!) 
    textField.selectedTextRange = newSelectedRange 

    return false 
} 
2

यहाँ क्या वास्तव में डब्ल्यू एक तेज 3 संस्करण

extension UITextField { 
    func setCursor(position: Int) { 
     let position = self.position(from: beginningOfDocument, offset: position)! 
     selectedTextRange = textRange(from: position, to: position) 
    } 
} 
0

है

DispatchQueue.main.async(execute: { 
    textField.selectedTextRange = textField.textRange(from: start, to: end) 
}) 

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

  • कोई संबंधित समस्या नहीं^_^