C#Xamarin UITextField设置光标位置

时间:2018-10-31 12:31:37

标签: c# ios xamarin uitextfield

我需要将UITextField的光标放置在与另一个先前的文本字段完全相同的位置。我将光标在第一个文本字段中的位置记为nint index = txtToField.GetOffsetFromPosition(txtToField.BeginningOfDocument, txtToField.SelectedTextRange.Start);,它可以正确地从光标当前所在的文本字段的开头获取字符数。经过一些研究,并使用以下问题:

Setting cursor position of 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中不起作用吗?

我正在使用Xamarin和Xamarin.iOS版本12.0.0.15的7.6.10版本(内部版本27)。

1 个答案:

答案 0 :(得分:1)

原因: 光标位于dafault中文本的末尾。当您初始化UITextField并将其通过方法ViewDidLoad设置为FirstResponder时,视图仍未完成初始化。

解决方案: 您可以在方法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.1s)。

//...
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);
}