COCOA - 如何在NSTextfield中达到最大长度时,文本字段不允许输入文本?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了COCOA - 如何在NSTextfield中达到最大长度时,文本字段不允许输入文本?相关的知识,希望对你有一定的参考价值。

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

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

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

//码

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

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

提前致谢。

答案

最简单的,你需要的是子类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:)

以上是关于COCOA - 如何在NSTextfield中达到最大长度时,文本字段不允许输入文本?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Cocoa 填充 PDF - 使用 NSTextField 内容填充 PDF 文本字段?

更改为等宽数字字体后,Cocoa NSTextField 文本在视图中被截断

Cocoa:如何将布尔属性绑定到 NSCellStateValue?

NSTextField isFirstResponder

Cocoa NSTextField 拖放需要子类...真的吗?

如何在可可的 nstextfield 上设置字体和颜色?