在自定义渲染器

时间:2016-11-08 03:45:01

标签: xamarin xamarin.forms

我有一个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方法,这是虚拟的,但是,我无法在运行时覆盖这样的类方法。

如何从自定义渲染器执行此操作?

1 个答案:

答案 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); } }; 现在永远不应该清除,除非用户执行删除