[ios] Swift에서 UITextField 및 UITextView의 커서 위치 가져 오기 및 설정

나는 실험을 해왔고 UITextField커서 위치로 작업하는 방법. 나는 다음과 같이 많은 관계 Objective-C 답변을 찾았습니다.

하지만 Swift로 작업하고 있기 때문에 현재 커서 위치를 가져오고 Swift에서 설정하는 방법을 배우고 싶었습니다.

아래 답변은 Objective-C에서 실험 및 번역 한 결과입니다.



답변

다음 내용은 UITextFieldUITextView.

유용한 정보

텍스트 필드 텍스트의 맨 처음 :

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()텍스트 필드에 포커스를 키보드가 나타나도록.

  • 특정 범위에서 텍스트를 얻는 방법 은 이 답변 을 참조하십시오 .

또한보십시오


답변

제 경우에는 DispatchQueue를 사용해야했습니다.

func textViewDidBeginEditing(_ textView: UITextView) {

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

이것과 다른 스레드에서 다른 것은 작동하지 않았습니다.

추신 : 어떤 스레드가 textViewDidBeginEditing이 실행되고 있는지 두 번 확인했으며 모든 UI가 실행되어야하므로 주 스레드 였으므로 main.asynch를 사용하여 약간의 지연이 작동하는 이유를 모르겠습니다.


답변

포인트에서 커서 위치 설정 :

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

커서 위치 재설정 :

textView.endFloatingCursor()

참고 :이 예제는 Textview 및 Textfield 모두에서 작동합니다.


답변

let range = field.selectedTextRange

field.text = "hello world"

field.selectedTextRange = range 


답변