Monotouch UITextField只有数字
本文关键字:数字 UITextField Monotouch | 更新日期: 2023-09-27 17:51:12
我找不到任何解决方案如何限制textfield
只允许Monotouch中的数字。
我还希望有一个不超过8个字符
要在MonoTouch中实现数字UITextField
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
覆盖方法中,可以对新输入的文本执行适当的测试,如果无效,可以返回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));
}
}
shouldchangecharters的内容是从redent84的答案中复制粘贴的。我只是想给出这个答案来展示如何子类化UITextField。
如果你使用我的方法,你不能在UITextField上使用委托就像Redent84那样因为你会得到一个运行时错误说委托已经被分配了
如果不创建委托子类,我不知道如何做到这一点。
另外,不要忘记在可视化编辑器中将文本字段的类更改为CustomTextField或您决定命名的任何名称