Monotouch UITextField只有数字

本文关键字:数字 UITextField Monotouch | 更新日期: 2023-09-27 17:51:12

我找不到任何解决方案如何限制textfield只允许Monotouch中的数字。

我还希望有一个不超过8个字符

Monotouch UITextField只有数字

要在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或您决定命名的任何名称