2016-01-21 14 views
43

में UITextField और UITextView की कर्सर स्थिति प्राप्त करना और सेट करना UITextField और इसके कर्सर की स्थिति के साथ कैसे काम करना है, मैं प्रयोग कर रहा हूं। मैंस्विफ्ट

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

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

उत्तर

136

इस उत्तर स्विफ्ट 3

निम्न सामग्री 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!) 
} 

वर्तमान कर्सर पदों पर सम्मिलित पाठ n

textField.insertText("Hello") 

नोट्स

  • उपयोग textField.becomeFirstResponder() पाठ क्षेत्र के लिए ध्यान केंद्रित करने देने के लिए और कुंजीपटल प्रदर्शित करने के लिए।

  • कैसे कुछ दूरी पर पाठ पाने के लिए this answer देखें।

भी

+0

startPosition का उद्देश्य क्या है? तुम्हारे द्वारा इससे क्या किया जा सकता है? कर्सर की स्थिति पाने के लिए किसी को भी क्या उद्देश्य चाहिए? – Honey

+1

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

+0

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

2

देखें मेरे मामले में मैं DispatchQueue का इस्तेमाल किया था:

func textViewDidBeginEditing(_ textView: UITextView) { 

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

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

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