加载UIView时,如何在iPhone SDK上设置UITextField的最大字符数?

推荐答案

虽然UITextField类没有最大长度属性,但通过设置文本字段的delegate并实现以下委托方法来获得此功能相对简单:

Objective-C

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    // Prevent crashing undo bug – see note below.
    if(range.length + range.location > textField.text.length)
    {
        return NO;
    }
        
    NSUInteger newLength = [textField.text length] + [string length] - range.length;
    return newLength <= 25;
}

Swift

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    
    let currentCharacterCount = textField.text?.count ?? 0
    if range.length + range.location > currentCharacterCount {
        return false
    }
    let newLength = currentCharacterCount + string.count - range.length
    return newLength <= 25
}

在文本字段更改之前,UITextField会询问学员是否更改了指定的文本字段.此时文本字段没有改变,所以我们获取它的当前长度和插入的字符串长度(通过粘贴复制的文本或使用键盘键入单个字符),减go 范围长度.如果该值太长(本例中超过25个字符),则返回NO以禁止更改.

当在文本字段末尾键入单个字符时,range.location将是当前字段的长度,range.length将是0,因为我们不会替换/删除任何内容.插入到文本字段的中间只表示不同的range.location,粘贴多个字符表示string中有多个字符.

删除单个字符或剪切多个字符由长度非零的range和空字符串指定.替换只是使用非空字符串的范围删除.

A note on the crashing "undo" bug

正如 comments 中提到的,有一个UITextField的bug可能会导致崩溃.

如果粘贴到字段中,但验证实现阻止了粘贴,则粘贴操作仍会记录在应用程序的undo撤消缓冲区中.如果随后启动撤销(通过晃动设备并确认撤销),UITextField将try 用空字符串替换它粘贴到自身的字符串.这将崩溃,因为它从未将字符串粘贴到自身中.它将try 替换字符串中不存在的部分.

幸运的是,你可以保护这UITextField人不会像这样自杀.您只需要确保它建议替换does的范围存在于其当前字符串内.这就是上面的初始健全性判断所做的.

swift 3.0 with copy and paste working fine.

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
        let str = (textView.text + text)
        if str.characters.count <= 10 {
            return true
        }
        textView.text = str.substring(to: str.index(str.startIndex, offsetBy: 10))
        return false
    }

希望对你有帮助.

Ios相关问答推荐

设置堆栈视图的所有属性

UITableViewCell编程约束问题

在视图上执行手势会阻止相机操作

如何在SwiftUI中基于嵌套视图中的状态动态显示外部视图的内容?

Swift Vision库识别文本后如何将其赋值给 struct 体实例属性以供显示?

不可发送类型 '[String : Any]?'在调用非隔离实例方法 XXX 时退出主参与者隔离上下文不能跨越参与者边界

使用按位|带有布尔操作数

Swift/iOS:泛型错误:协议需要嵌套类型V;你想添加它吗?

我需要二进制文件来进行 App Store 应用程序传输吗?

如何从 Locale Swift 获取货币符号

在视图控制器中实例化视图控制器是否可能/智能?

TextField 重复输入 SwiftUI

XCode 14 Beta 中 NavigationStack 的正文渲染问题

如何从 scendelegate 打开我的标签栏控制器

iPhone 6 和 6 Plus 媒体查询

在 iOS 中获取设备位置(仅限国家/地区)

是否可以在没有 Mac 的情况下为 iOS 制作 PhoneGap 应用程序?

interfaceOrientation在 iOS 8 中已弃用,如何更改此方法 Objective C

iOS:设备旋转后如何运行函数(Swift)

在两个或多个 iPhone 应用程序之间共享数据