我想限制NSTextField
上的字符输入,即不允许出现不允许的字符。我发现的关于此主题的大部分内容都是仅在文本输入完成后使用NSFormatter
进行验证的解决方案,该NSTextField
仍允许出现该字符。
到目前为止,我提出了这个解决方案,对class RestrictedTextField : NSTextField
{
static let VALID_CHARACTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890'-.& ";
override func textDidChange(notification:NSNotification)
{
for c in stringValue
{
if (RestrictedTextField.VALID_CHARACTERS.rangeOfString("\(c)") == nil)
{
stringValue = stringValue.stringByReplacingOccurrencesOfString("\(c)", withString: "", options: .LiteralSearch, range: nil);
break;
}
}
}
}
进行了分类:
getElementsByClassName()
它有效,但并不是最佳选择,因为如果尝试输入无效字符,则textcursor仍会移动一个空格。我也认为循环不是必要的,所以我想知道有人知道更优雅的解决方案吗?
答案 0 :(得分:3)
您可以使用NSFormatter
的子类完全控制。我不确定你为什么认为自己没有。
覆盖isPartialStringValid(_:proposedSelectedRange:originalString:originalSelectedRange:errorDescription:)
并实现所需的逻辑。来自docs(我做了一些小编辑):
在子类实现中,根据上下文计算[
*partialStringPtr
]指向的字符串。如果YES
可以接受,则返回partialStringPtr
;如果NO
不可接受,则返回partialStringPtr
。如果您要替换字符串并更改选择范围,请将新字符串分配给partialStringPtr
,将新范围分配给proposedSelRangePtr
并返回NO
。
因此,如果用户尝试插入不允许的字符,您可以完全拒绝其编辑,也可以修改它以删除那些不允许的字符。 (请注意,用户更改可以包括粘贴,因此它不一定只是一个类型字符。)要完全拒绝更改,请将origString
分配给*partialStringPtr
和origSelRange
{ {1}}。