UITextField выделяет весь текст в фокусе, когда контент длинный — как сохранить курсор в конце?IOS

Программируем под IOS
Ответить
Anonymous
 UITextField выделяет весь текст в фокусе, когда контент длинный — как сохранить курсор в конце?

Сообщение Anonymous »

Я создаю собственное поле ввода, используя UITextField. Когда пользователь нажимает на поле, чтобы сфокусировать его, а текст длинный, по умолчанию выделяется весь текст. Это то же самое поведение, которое вы можете увидеть в поле поиска iOS Safari или в поле поиска приложения «Сообщения».
Что я хочу: когда поле становится первым отвечающим, курсор должен быть помещен в конец текста (последнее слово), не выделяя весь текст.
Вот код, который создает мое текстовое поле:

Код: Выделить всё

public func makeTextField() -> UITextField {
let textField = UITextField()

textField.autocorrectionType = .no
textField.setContentCompressionResistancePriority(.required, for: .horizontal)
textField.setContentCompressionResistancePriority(.required, for: .vertical)
if #available(iOS 13.0, *) {
textField.smartInsertDeleteType = .no
}
textField.smartQuotesType = .no
textField.smartDashesType = .no
textField.autocapitalizationType = .none
textField.contentMode = .scaleToFill

if let font = attributes[.font] as? UIFont {
textField.font = font
}
if let color = attributes[.foregroundColor] as? UIColor {
textField.textColor = color
}

// Truncate long text at the head
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineBreakMode = .byTruncatingHead
textField.defaultTextAttributes[.paragraphStyle] = paragraphStyle

textField.delegate = self
textField.backgroundColor = .clear
textField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
return textField
}
При фокусировке поля выделяется весь текст, если текст длинный.
Что я пробовал
Принудительно довести курсор до конца в textFieldDidBeginEditing:

Код: Выделить всё

func textFieldDidBeginEditing(_ textField: UITextField) {
let end = textField.endOfDocument
textField.selectedTextRange = textField.textRange(from: end, to: end)
}
Выполняем то же самое асинхронно (следующий цикл выполнения), чтобы избежать переопределения выбора системой:

Код: Выделить всё

func textFieldDidBeginEditing(_ textField: UITextField) {
DispatchQueue.main.async {
let end = textField.endOfDocument
textField.selectedTextRange = textField.textRange(from: end, to: end)
}
}
Несмотря на это, система по-прежнему выделяет весь текст в фокусе, когда строка длинная/обрезана в начале.

Подробнее здесь: https://stackoverflow.com/questions/798 ... o-keep-the
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»