Xamarin 在自定义渲染器中重写本机控件方法

Xamarin 在自定义渲染器中重写本机控件方法,xamarin,xamarin.forms,Xamarin,Xamarin.forms,我有一个ExtendedEntry控件,用于扩展每个平台的Entry控件的功能 在自定义渲染器中,我可以访问控件属性,即UITextField。此属性允许我在运行时轻松更改UITextField的属性。例如: public class ExtendedEntryRenderer : EntryRenderer { protected override void OnElementChanged(ElementChangedEventArgs<Entry> e) {

我有一个
ExtendedEntry
控件,用于扩展每个平台的
Entry
控件的功能

在自定义渲染器中,我可以访问
控件
属性,即
UITextField
。此属性允许我在运行时轻松更改
UITextField
的属性。例如:

public class ExtendedEntryRenderer : EntryRenderer
{
    protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
    {
        base.OnElementChanged(e);

        Control.ClearButtonMode = UITextFieldViewMode.WhileEditing;

        // ...
    }
}
公共类ExtendedEntryRenderer:EntryRenderer
{
受保护的覆盖无效OnElementChanged(ElementChangedEventArgs e)
{
基础。一个要素发生变化(e);
Control.ClearButtonMode=UITextFieldViewMode.WhileEdit;
// ...
}
}
在iOS上,我想重写
UITextField
控件的
bool BecomeFirstResponder
方法,该方法是虚拟的,但是,我无法在运行时重写这样的类方法


如何从自定义呈现程序执行此操作?

不确定您在
成为第一响应者时实际想要做什么,但是如果不创建
UITextField
的自定义子类,您可以创建自定义
UITextField委托
并将其分配给
UITextField.Delegate
属性

如果您试图阻止字段成为第一响应者,可以使用
UITextFieldDelegate.ShouldBeginEditing
返回
false
,在调用
BecomeFirstResponder
之前调用此方法,在调用
BecomeFirstResponder
之后调用
UITextFieldDelegate。在调用
BecomeFirstResponder
之后调用EditingStarted

public class TextFieldDelegate : UITextFieldDelegate
{
    public override bool ShouldBeginEditing(UITextField textField)
    {
        return base.ShouldBeginEditing(textField);
    }

    public override void EditingStarted(UITextField textField)
    {
        base.EditingStarted(textField);
    }
}
请参阅以下链接,以查看
UITextFieldDelegate
的所有方法调用的完整顺序/流程:

public class SecureTextFieldDelegate : UITextFieldDelegate
{
    public override void EditingStarted(UITextField textField)
    {
        if (textField.SecureTextEntry != true)
        {
            var text = textField.Text;
            textField.DeleteBackward();
            textField.InsertText(text);
        }
    }
}
参考:

更新:

下面是我如何在编辑时切换/不清除字段的
SecureTextEntry

1) 自定义
UITextFieldDelegate

public class SecureTextFieldDelegate : UITextFieldDelegate
{
    public override void EditingStarted(UITextField textField)
    {
        if (textField.SecureTextEntry != true)
        {
            var text = textField.Text;
            textField.DeleteBackward();
            textField.InsertText(text);
        }
    }
}
2) 设置UITextField:

uiTextField.Delegate = new SecureTextFieldDelegate();
3) 切换和/或物理键盘字段选项卡的手柄触摸:

uiSwitch.ValueChanged += (object sender, EventArgs e) =>
{
    uiTextField.SecureTextEntry = !uiTextField.SecureTextEntry;
    if (uiTextField.SecureTextEntry == true)
    {
        var text = uiTextField.Text;
        uiTextField.DeleteBackward();
        uiTextField.InsertText(text);
    }
};

UITextField.Text
现在应该永远不会清除,除非用户执行删除操作

当焦点恢复且用户再次开始编辑时,我试图阻止UITextField覆盖密码字段(用于密码可见性切换按钮)。这是Obj-C解决方案:。我会看一看你发布的委托解决方案,看看我能想出什么。@kspearrin啊……除非你使用的是子类
UITextField
,否则自定义委托就是一条出路。。。,签出我的更新尝试在自定义呈现程序中连接委托时,我似乎遇到以下错误
OnElementChanged
Control.delegate=new SecureTextFieldDelegate()<代码>System.InvalidOperationException:事件注册正在覆盖现有委托。只需使用事件或您自己的委托:ExtendedEntryRenderer+SecureTextFieldDelegate UIKit.UITextField+\U UITextFieldDelegate
。我需要先注销某个默认委托还是什么?