swift - COCOA - 如何使文本字段在 NSTextfield 中达到最大长度时不允许文本输入?
问题描述
我是 MAC 开发的新手。如果答案已经在任何地方解释,请在评论中添加链接。在这种情况下,我将删除问题。
目前,如果文本字段长度达到最大计数,我将显示警报。但是,最后输入的字符仍然存在于文本字段中,因此用户需要退格。
我也尝试过使用 NSFormatter,但失败了。
//代码
override func controlTextDidChange(_ obj: Notification) {
if let textField = obj.object as? NSTextField {
if textField.stringValue.count > x {
// display alert
}
}
}
我期待的是用户应该输入文本,但不应该显示文本。不应该像我们在 web 中实现的那样允许文本输入而不是警报。
提前致谢。
解决方案
最简单的情况是,您只需要子类化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:)
.
推荐阅读
- php - 使用文本框中的参数调用 php
- bitmap - 如何将mipmap数据变成位图?
- c# - 自定义身份验证类型的登录页面设计:个人用户帐户 ASP.NET core 2.1、MVC、c#
- python - 如何调试“FileNotFoundError: [WinError 2] 系统找不到指定的文件”?
- ruby-on-rails - 为什么在我更改 Rails 应用程序中的 Bundler 后,Elastic Beanstalk 一直要求我从 root 用户更改它?
- sql - 如何在 Django ORM 查询中包含来自外键对象的数据?
- elasticsearch - 在 Elasticsearch 中,如何将规范化器与嵌套对象结合起来?
- node.js - 我是否必须更换 Google+ API
- vb.net - 如何在 VB .net 中左右修剪字符串
- android - 无法在 android 中查看 RecyclerView 上的数据