我没有找到任何解决方案如何限制textfield
Monotouch 中只允许数字。
我也希望有不超过 8 个字符。
为了UITextField
在 MonoTouch 中实现仅数字 s,我使用以下代码:
var numberTextField = new UITextField { KeyboardType = UIKeyboardType.NumberPad };
numberTextField.ShouldChangeCharacters = (textField, range, replacement) =>
{
int number;
return replacement.Length == 0 || int.TryParse(replacement, out number);
};
并限制特定数量的字符:
const int maxCharacters = 8;
textField.ShouldChangeCharacters = (textField, range, replacement) =>
{
var newContent = new NSString(textField.Text).Replace(range, new NSString(replacement)).ToString();
return newContent.Length <= maxCharacters;
};
所以,结合:
const int maxCharacters = 8;
var numberTextField = new UITextField { KeyboardType = UIKeyboardType.NumberPad };
numberTextField.ShouldChangeCharacters = (textField, range, replacement) =>
{
var newContent = new NSString(textField.Text).Replace(range, new NSString(replacement)).ToString();
int number;
return newContent.Length <= maxCharacters && (replacement.Length == 0 || int.TryParse(replacement, out number));
};
实现这一点的最简单方法是创建自己的继承自 的控件UITextField
,然后创建继承自的委托UITextFieldDelegate
并将其分配为控件的Delegate
.
在委托的ShouldChangeCharacters
override 方法中,您可以对新输入的文本执行适当的测试,如果它无效,您可以返回 false 以防止更新文本字段。
在 MonoTouch/C# 中,这是将文本字段限制为数字的更好方法。
textCardNumber.ShouldChangeCharacters = (UITextField textField, NSRange range, string replace) => {
int dummy;
return replace.Length == 0 || int.TryParse (replace, out dummy);
};
编辑:增加了能够删除的能力。
如果您想将 UITextField 子类化为可重用代码,这就是我所做的。
[Register("CustomTextField")]
public class CustomTextField : UITextField
{
public CustomTextField() : base() {}
public CustomTextField(IntPtr handle) : base(handle)
{
Delegate = new CustomDelegate();
}
private class CustomDelegate : UITextFieldDelegate
{
public override bool ShouldChangeCharacters(UITextField textField, NSRange range, string replacementString)
{
int maxCharacters = 8;
var newContent = new NSString(textField.Text).Replace(range, new NSString(replacement)).ToString();
int number;
return newContent.Length <= maxCharacters && (replacement.Length == 0 || int.TryParse(replacement, out number));
}
}
ShouldChangeCharacters 的内容只是从 redent84 的答案中复制和粘贴的。我只想给出这个答案来展示如何继承 UITextField。
此外,如果您使用我的方法,则不能像 Redent84 那样在 UITextField 上使用委托,因为您会收到运行时错误,说明委托已分配。
如果不创建委托子类,我不知道如何做到这一点。
此外,不要忘记将可视化编辑器中文本字段的类更改为 CustomTextField 或您决定命名的任何名称。