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
。我需要先注销某个默认委托还是什么?