나는 실험을 해왔고 UITextField
커서 위치로 작업하는 방법. 나는 다음과 같이 많은 관계 Objective-C 답변을 찾았습니다.
하지만 Swift로 작업하고 있기 때문에 현재 커서 위치를 가져오고 Swift에서 설정하는 방법을 배우고 싶었습니다.
아래 답변은 Objective-C에서 실험 및 번역 한 결과입니다.
답변
다음 내용은 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()
텍스트 필드에 포커스를 키보드가 나타나도록. -
특정 범위에서 텍스트를 얻는 방법 은 이 답변 을 참조하십시오 .
또한보십시오
답변
제 경우에는 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