首页 > 解决方案 > COCOA - 如何使文本字段在 NSTextfield 中达到最大长度时不允许文本输入?

问题描述

我是 MAC 开发的新手。如果答案已经在任何地方解释,请在评论中添加链接。在这种情况下,我将删除问题。

目前,如果文本字段长度达到最大计数,我将显示警报。但是,最后输入的字符仍然存在于文本字段中,因此用户需要退格。

我也尝试过使用 NSFormatter,但失败了。

//代码

override func controlTextDidChange(_ obj: Notification) {
  if let textField = obj.object as? NSTextField {
     if textField.stringValue.count > x {
         // display alert
     }
  }
}

我期待的是用户应该输入文本,但不应该显示文本。不应该像我们在 web 中实现的那样允许文本输入而不是警报。

提前致谢。

标签: swiftmacoscocoanstextfield

解决方案


最简单的情况是,您只需要子类化Formatter和覆盖 3 个方法:

class MyFormatter: Formatter {
    var maxLength = Int.max

    override func string(for obj: Any?) -> String? {
        return obj as? String
    }

    override func getObjectValue(_ obj: AutoreleasingUnsafeMutablePointer<AnyObject?>?, for string: String, errorDescription error: AutoreleasingUnsafeMutablePointer<NSString?>?) -> Bool {
        obj?.pointee = string as NSString
        return true
    }

    override func isPartialStringValid(_ partialString: String, newEditingString newString: AutoreleasingUnsafeMutablePointer<NSString?>?, errorDescription error: AutoreleasingUnsafeMutablePointer<NSString?>?) -> Bool {
        return partialString.count <= maxLength
    }
}

然后为您的文本字段设置格式化程序:

let formatter = MyFormatter()
formatter.maxLength = 10

textField.formatter = formatter

这足以防止用户输入超过 10 个字符或粘贴长度超过 10 个字符的字符串。如果您想要更高级的功能,例如在粘贴长字符串时获取前 10 个字符,您应该覆盖isPartialStringValid(_:proposedSelectedRange:originalString:originalSelectedRange:errorDescription:).


推荐阅读