限制UITextView或UITextField中的粘贴字符串长度

Kev*_* L. 7 iphone cocoa-touch uitextfield uitextview iphone-sdk-3.0

限制直接输入UITextView或UITextField的字符串的问题已在SO上解决:

但是现在使用OS 3.0复制和粘贴成为一个问题,因为上述SO问题中的解决方案不会阻止粘贴其他字符(即,您不能在使用上述解决方案配置的字段中键入超过10个字符但是您可以轻松地将100个字符粘贴到同一个字段中).

有没有办法防止直接输入字符串粘贴字符串溢出?

Kev*_* L. 10

我能够通过符合UITextViewDelegate协议中的textViewDidChange:方法来限制输入和粘贴的文本.

- (void)textViewDidChange:(UITextView *)textView
{
    if (textView.text.length >= 10)
    {
        textView.text = [textView.text substringToIndex:10];
    }
}
Run Code Online (Sandbox Code Playgroud)

但我仍然认为这种丑陋的黑客攻击,似乎Apple应该提供UITextFields和UITextViews的某种"maxLength"属性.

如果有人知道更好的解决方案,请告诉我们.


Rob*_*Rob 7

根据我的经验,只需实现委托方法:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
Run Code Online (Sandbox Code Playgroud)

适用于粘贴.整个粘贴的字符串在replacementString:参数中出现.只检查它的长度,如果它长于你的最大长度,那么只需从这个委托方法返回NO.这导致无法粘贴任何内容.或者你可以像早期的答案建议那样对它进行子串,但如果它太长,这可以防止粘贴,如果这是你想要的.


Bra*_*oss 6

在textViewDidChange中插入文本后更改文本:如果用户在粘贴后按"撤消",则会导致应用程序崩溃.

我玩了很多,并得到了一个有效的解决方案.基本上逻辑是,如果总长度大于最大字符,则不允许粘贴,检测溢出的量并仅插入部分字符串.

使用此解决方案,您的粘贴板和撤消管理器将按预期工作.

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text {
    NSInteger newLength = textView.text.length - range.length + text.length;

    if (newLength > MAX_LENGTH) {
        NSInteger overflow = newLength - MAX_LENGTH;

        dispatch_async(dispatch_get_main_queue(), ^{
            UITextPosition *start = [textView positionFromPosition:nil offset:range.location];
            UITextPosition *end = [textView positionFromPosition:nil offset:NSMaxRange(range)];
            UITextRange *textRange = [textView textRangeFromPosition:start toPosition:end];
            [textView replaceRange:textRange withText:[text substringToIndex:text.length - overflow]];
        });
        return NO;
    }
    return YES;
}
Run Code Online (Sandbox Code Playgroud)


Dav*_*des 0

您上面链接的第一个问题的答案之一应该有效,即使用类似的东西

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(limitTextField:) name:@"UITextFieldTextDidChangeNotification" object:myTextField];
Run Code Online (Sandbox Code Playgroud)

监视 UITextField 中文本的更改并在适当时缩短它。