c # Xamarin UITextField установка позиции курсора - PullRequest
0 голосов
/ 31 октября 2018

Мне нужно расположить курсор UITextField в той же позиции, что и другое предыдущее текстовое поле. Я получаю позицию курсора в первом текстовом поле как nint index = txtToField.GetOffsetFromPosition(txtToField.BeginningOfDocument, txtToField.SelectedTextRange.Start);, которая правильно получает количество символов в начале текстового поля, в котором находится мой курсор. После некоторого исследования и использования вопроса ниже:

Установка позиции курсора UITextField

Я попытался реализовать решение вопроса для установки позиции курсора в текстовом поле, используя индекс, который я получил ранее. Это не работает, и после создания текстового поля первым респондентом и запустив:

txtTo.BecomeFirstResponder();
UITextPosition positionSet = txtTo.GetPosition(txtTo.BeginningOfDocument, position);
txtTo.SelectedTextRange = txtTo.GetTextRange(positionSet, positionSet);

Он автоматически помещает курсор в конец UITextField. Кроме того, я попытался проверить, работает ли метод SelectedTextRange, как ожидалось, однако при попытке установить весь текст в текстовом поле как выбранный:

txtTo.BecomeFirstResponder();
txtTo.SelectedTextRange = txtTo.GetTextRange(txtTo.BeginningOfDocument, txtTo.EndOfDocument);

Он также автоматически помещает курсор в конец UITextField, что является стандартным поведением для BecomeFirstResponder(). SelectedTextRange не работает в этой текущей версии Xamarin?

Я использую версию 7.6.10 (сборка 27) Xamarin и Xamarin.iOS версии 12.0.0.15.

1 Ответ

0 голосов
/ 01 ноября 2018

Причина: Курсор находится в конце текста в dafault. Когда вы инициализируете UITextField и устанавливаете его как FirstResponder в методе ViewDidLoad. Представление еще не завершено init.

Решение: Вы можете вызвать этот метод в методе EditingStarted. И не забудьте установить делегат.

public partial clas xxxViewController:UIViewController,IUITextFieldDelegate

txtTo.WeakDelegate=this;

[Export("textFieldDidBeginEditing:")]
public void EditingStarted(UITextField textField)
{
  NSRange range = new NSRange(index, 0);
  UITextPosition start = textField.GetPosition(textField.BeginningOfDocument, range.Location);
  UITextPosition end = textField.GetPosition(start, range.Length);
  textField.SelectedTextRange = textField.GetTextRange(start, end);
} 

Если вы хотите вызвать их в ViewDidLoad. Вы можете установить задержку (например, 0,1 с).

//...
this.PerformSelector(new Selector("MoveCursorPosition:"),txtTo,0.1);
//...

[Export("MoveCursorPosition:")]
public void MoveCursorPosition(UITextField textField)
{
  NSRange range = new NSRange(index, 0);
  UITextPosition start = textField.GetPosition(textField.BeginningOfDocument, range.Location);
  UITextPosition end = textField.GetPosition(start, range.Length);
  textField.SelectedTextRange = textField.GetTextRange(start, end);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...