11

我想将可以在 iOS 应用程序中输入到 UITextField 的字符数限制为 25 个字符。

根据这篇文章,它可以像这样在 Objective-C 中完成:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSUInteger newLength = [textField.text length] + [string length] - range.length;
    return (newLength > 25) ? NO : YES;
}

如何在 C# 中使用 Xamarin.iOS 做同样的事情?

4

5 回答 5

32

这是未经测试的,但我相信它可能有效:

UITextField myField;
myField.ShouldChangeCharacters = (textField, range, replacementString) => {
    var newLength = textField.Text.Length + replacementString.Length - range.Length;
    return newLength <= 25;
};
于 2013-06-21T23:21:28.243 回答
2

我最终用一个委托而不是lamba符号来做:

UITextField myField;
myField.ShouldChangeCharacters = new UITextFieldChange(delegate(UITextField textField, MonoTouch.Foundation.NSRange range, string replacementString) {
    int newLength = textField.Text.Length + replacementString.Length - range.Length;
    return newLength <= 25;
});

但我认为 Rolf 使用 lambda 的方式更容易阅读。

于 2013-06-24T22:45:20.987 回答
2

在处理此问题 2 天后,我自己找到了解决方案。它适用于复制/粘贴案例。希望它会有用。

public static bool CheckTexfieldMaxLength (UITextField textField, NSRange range, string replacementString, int maxLength)
    {

        int maxLength = 10;
        int newLength = (textField.Text.Length - (int)range.Length) + replacementString.Length;
        if (newLength <= maxLength) {
            return true;
        } else {
            if (range.Length == 0 && range.Location > 0 && replacementString.Length > 0 && textField.Text.Length >= maxLength)
                return false;

            int emptySpace = maxLength - (textField.Text.Length - (int)range.Length);

            textField.Text = textField.Text.Substring (0, (int)range.Location)
            + replacementString.Substring (0, emptySpace)
            + textField.Text.Substring ((int)range.Location + (int)range.Length, emptySpace >= maxLength ? 0 : (maxLength - (int)range.Location - emptySpace));
            return false;
        }
    }
于 2016-01-19T15:53:30.633 回答
1

确实已经有一段时间没有回答了,这是一个很好的解决方案,但是可以使用NotificationCenter. 这样,您甚至可以添加回调并使其像小组件一样在单独的类中工作。

我在这里添加它以防万一它可以帮助其他人。

NSNotificationCenter.DefaultCenter.AddObserver(
        UITextField.TextFieldTextDidChangeNotification, TextChangedEvent);

private void TextChangedEvent(NSNotification notification) {
    UITextField field = (UITextField)notification.Object;
    if (notification.Object == field) {             
        if (field.Text.Length >= 25) {
            field.Text = field.Text.Substring (0, 24);
        }
    }
}
于 2015-11-06T17:30:16.310 回答
1

我的解决方案是使用 EditingChange 事件:

_myUTextField.EditingChanged += (sender, e) =>{
   if (_myUTextField.Text.Length > maxLength){
      _myUTextField.Text = _myUTextField.Text.Substring(0, _myUTextField.Text.Length - 1);
   }
};
于 2019-03-20T14:47:41.760 回答