我有一个ExtendedEntry
控件,用于扩展每个平台的Entry
控件的功能。
在我的自定义渲染器中,我可以访问Control
属性,即UITextField
。此属性允许我在运行时轻松更改UITextField
的属性。例如:
public class ExtendedEntryRenderer : EntryRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged(e);
Control.ClearButtonMode = UITextFieldViewMode.WhileEditing;
// ...
}
}
在iOS上我想覆盖UITextField
控件的bool BecomeFirstResponder
方法,这是虚拟的,但是,我无法在运行时覆盖这样的类方法。
如何从自定义渲染器执行此操作?
答案 0 :(得分:1)
不确定您在BecomeFirstResponder
内实际想要做什么,但而不创建UITextField
的自定义子类,您可以创建自定义UITextFieldDelegate
并分配它到UITextField.Delegate
属性。
如果您试图阻止该字段成为第一响应者,您可以使用UITextFieldDelegate.ShouldBeginEditing
返回false
,此方法在调用BecomeFirstResponder
之前调用)和{{调用UITextFieldDelegate.EditingStarted
后调用1}}:
BecomeFirstResponder
请参阅以下链接,查看public class TextFieldDelegate : UITextFieldDelegate
{
public override bool ShouldBeginEditing(UITextField textField)
{
return base.ShouldBeginEditing(textField);
}
public override void EditingStarted(UITextField textField)
{
base.EditingStarted(textField);
}
}
所有方法调用的完整顺序/流程:
参考:https://developer.apple.com/reference/uikit/uitextfielddelegate
更新
以下是我在编辑时执行UITextFieldDelegate
切换/无清除字段的方法:
1)自定义SecureTextEntry
:
UITextFieldDelegate
2)设置您的UITextField:
public class SecureTextFieldDelegate : UITextFieldDelegate
{
public override void EditingStarted(UITextField textField)
{
if (textField.SecureTextEntry != true)
{
var text = textField.Text;
textField.DeleteBackward();
textField.InsertText(text);
}
}
}
3)Handle触摸切换和/或物理键盘字段Tabbing:
uiTextField.Delegate = new SecureTextFieldDelegate();
uiSwitch.ValueChanged += (object sender, EventArgs e) =>
{
uiTextField.SecureTextEntry = !uiTextField.SecureTextEntry;
if (uiTextField.SecureTextEntry == true)
{
var text = uiTextField.Text;
uiTextField.DeleteBackward();
uiTextField.InsertText(text);
}
};
现在永远不应该清除,除非用户执行删除