COCOA - 当 NSTextfield 达到最大长度时,如何使文本字段不允许输入文本?
COCOA - How to make textfield doesn't allow text entry when max length is reached in NSTextfield?
我是 MAC 开发的新手。如果答案已经在任何地方解释,请在评论中添加 link。在那种情况下我会删除问题。
目前,如果文本字段长度达到最大计数,我将显示 alert.But,最后输入的字符仍然出现在文本字段中,因此用户需要退格。
我也尝试过使用 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:)
.
我是 MAC 开发的新手。如果答案已经在任何地方解释,请在评论中添加 link。在那种情况下我会删除问题。
目前,如果文本字段长度达到最大计数,我将显示 alert.But,最后输入的字符仍然出现在文本字段中,因此用户需要退格。
我也尝试过使用 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:)
.