C# xamarin uitextfield установка позиции курсора

Мне нужно поместить курсор 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.

3
0
894
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Решение: Вы можете вызвать этот метод в методе 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);
}

Однако я никогда не начинаю редактировать этот UITextField. Это вызывается в ViewDidLoad сразу после того, как UITextField стал первым респондентом.

R. Duggan 01.11.2018 07:04

метод будет вызван при появлении поля BecomeFirstResponder, вы можете попробовать

Lucas Zhang - MSFT 01.11.2018 07:11

Спасибо. С более технической точки зрения, почему код, который я использовал, не работает в ViewDidLoad, но будет работать в методе EditingStarted?

R. Duggan 01.11.2018 07:15

Сначала дайте мне знать, решена ли ваша проблема, и тогда я расскажу вам более подробную информацию.

Lucas Zhang - MSFT 01.11.2018 07:19

Посмотрите мой ответ на обновление. Если ваша проблема решена, вы можете отметить это как ответ.

Lucas Zhang - MSFT 01.11.2018 07:37

Другие вопросы по теме