स्विफ्ट में UITextField और UITextView की कर्सर स्थिति प्राप्त करना और स्थापित करना


109

मैं प्रयोग कर रहा हूँ UITextFieldऔर यह कर्सर स्थिति के साथ कैसे काम करना है। मुझे कई संबंध वस्तुनिष्ठ-सी उत्तर मिले हैं, जैसे कि

लेकिन जब से मैं स्विफ्ट के साथ काम कर रहा हूं, मैं सीखना चाहता था कि वर्तमान कर्सर स्थान कैसे प्राप्त करें और इसे स्विफ्ट में भी सेट करें।

नीचे दिया गया उत्तर ऑब्जेक्टिव-सी से मेरे प्रयोग और अनुवाद का परिणाम है।

जवाबों:


316

निम्नलिखित सामग्री दोनों पर लागू होती है UITextFieldऔर UITextView

उपयोगी जानकारी

पाठ फ़ील्ड पाठ की बहुत शुरुआत:

let startPosition: UITextPosition = textField.beginningOfDocument

पाठ फ़ील्ड टेक्स्ट का बहुत अंत:

let endPosition: UITextPosition = textField.endOfDocument

वर्तमान में चयनित रेंज:

let selectedRange: UITextRange? = textField.selectedTextRange

कर्सर स्थिति प्राप्त करें

if let selectedRange = textField.selectedTextRange {

    let cursorPosition = textField.offset(from: textField.beginningOfDocument, to: selectedRange.start)

    print("\(cursorPosition)")
}

कर्सर स्थिति सेट करें

स्थिति निर्धारित करने के लिए, ये सभी विधियाँ वास्तव में समान प्रारंभ और अंत मानों के साथ एक सीमा निर्धारित कर रही हैं।

शुरुआत तक

let newPosition = textField.beginningOfDocument
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)

अंत की ओर

let newPosition = textField.endOfDocument
textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)

वर्तमान कर्सर स्थिति के बाईं ओर एक स्थिति के लिए

// only if there is a currently selected range
if let selectedRange = textField.selectedTextRange {

    // and only if the new position is valid
    if let newPosition = textField.position(from: selectedRange.start, offset: -1) {

        // set the new position
        textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
    }
}

एक अनियंत्रित स्थिति में

शुरुआत में शुरू करें और 5 वर्णों को दाईं ओर ले जाएं।

let arbitraryValue: Int = 5
if let newPosition = textField.position(from: textField.beginningOfDocument, offset: arbitraryValue) {

    textField.selectedTextRange = textField.textRange(from: newPosition, to: newPosition)
}

सम्बंधित

सभी पाठ का चयन करें

textField.selectedTextRange = textField.textRange(from: textField.beginningOfDocument, to: textField.endOfDocument)

पाठ की एक श्रृंखला का चयन करें

// Range: 3 to 7
let startPosition = textField.position(from: textField.beginningOfDocument, offset: 3)
let endPosition = textField.position(from: textField.beginningOfDocument, offset: 7)

if startPosition != nil && endPosition != nil {
    textField.selectedTextRange = textField.textRange(from: startPosition!, to: endPosition!)
}

वर्तमान कर्सर स्थिति पर टेक्स्ट डालें

textField.insertText("Hello")

टिप्पणियाँ

  • textField.becomeFirstResponder()टेक्स्ट फ़ील्ड पर फ़ोकस देने और कीबोर्ड को प्रदर्शित करने के लिए उपयोग करें ।

  • कुछ सीमा पर पाठ कैसे प्राप्त करें, इसके लिए यह उत्तर देखें ।

यह सभी देखें


शुरुआत का उद्देश्य क्या है? तुम्हारे द्वारा इससे क्या किया जा सकता है? यह भी क्या उद्देश्य है कि किसी को कर्सर की स्थिति प्राप्त करने की आवश्यकता हो सकती है?
शहद

2
@ यहाँ, मैंने उस चर नाम का उपयोग दो अलग-अलग चीजों के संदर्भ में किया है। सबसे पहले पाठ क्षेत्र की शुरुआत को संदर्भित करना था। यदि आप कर्सर को वहां ले जाना चाहते हैं तो यह उपयोगी होगा। दूसरा था पाठ की एक चयनित श्रेणी के भीख मांगने का। यदि आप उस सीमा को कॉपी करना चाहते हैं या उस पर कुछ विशेषता सेट करना चाहते हैं तो यह उपयोगी है।
सुरगाछ

क्या टेक्स्टफील्ड के खाली होने पर कर्सर को दाईं ओर ले जाने के लिए कुछ है? मैंने आपके उत्तर का पालन किया लेकिन मैं इसे नहीं बना सका।
युकेल बेराम

1
@yucelbayram, आप H का उपयोग करने के बाद कर्सर रख सकते हैं textField.endOfDocument। आप लापता अक्षरों का प्रतिनिधित्व करने के लिए अंडरस्कोर या रिक्त स्थान का उपयोग भी कर सकते हैं।
सुरगाछ

1
@ एरियलएसडी, मुझे क्षमा करें, मैंने कुछ समय के लिए इस पर काम नहीं किया है। मुझे याद नहीं आ रहा है।
सुरग

42

मेरे मामले में मुझे DispatchQueue का उपयोग करना पड़ा:

func textViewDidBeginEditing(_ textView: UITextView) {

   DispatchQueue.main.async{
      textField.selectedTextRange = ...
   }
}

इस और अन्य धागे से कुछ भी काम नहीं किया।

पुनश्च: मैंने डबल चेक किया कि कौन सा धागा textViewDidBeginEditing पर चल रहा था, और यह मुख्य धागा था, जैसा कि सभी यूआई पर चलना चाहिए, इसलिए यह निश्चित नहीं है कि main.asynch का उपयोग करने में थोड़ी देरी क्यों हुई।


2
यह देरी नहीं बल्कि अगला रन लूप है। सबसे अधिक संभावना है कि टेक्स्टफ़ील्ड की चयनित सीमा को उसी फ़ंक्शन द्वारा संशोधित किया जा रहा है जिसे कहा जाता है textViewDidBeginEditing। इसलिए इसे कतार में रखकर कॉल करने वाले के समाप्त होने के बाद होगा।
माइकल ओजेरानस्की

@MichaelOzeryansky हाँ, मुझे भी ऐसा लगता है। लेकिन यह सवाल भी पैदा करता है - क्या कर्सर स्थिति को मैन्युअल रूप से सेट करने की सही विधि है?
समयसीमा

इस मामले में मेरे हल के रूप में अच्छी तरह से काम किया
Hattori Hanz

1

अपने बिंदु पर सेट कर्सर स्थिति के लिए:

textView.beginFloatingCursor(at: CGPoint(x: 10.0, y: 10.0))

रीसेट स्थिति के लिए:

textView.endFloatingCursor()

नोट : यह उदाहरण Textview और Textfield दोनों में काम करता है।


@Suragch फ्लोटिंग कर्सर टेक्स्ट व्यू या टेक्स्टफिल्ड में कर्सर लोकेशन सेट करने की एक विधि है।
पार्थ पटेल

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.