限制NSTextField上的输入

时间:2015-06-17 06:39:04

标签: macos swift cocoa nstextfield

我想限制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仍会移动一个空格。我也认为循环不是必要的,所以我想知道有人知道更优雅的解决方案吗?

1 个答案:

答案 0 :(得分:3)

您可以使用NSFormatter的子类完全控制。我不确定你为什么认为自己没有。

覆盖isPartialStringValid(_:proposedSelectedRange:originalString:originalSelectedRange:errorDescription:)并实现所需的逻辑。来自docs(我做了一些小编辑):

  

在子类实现中,根据上下文计算[*partialStringPtr]指向的字符串。如果YES可以接受,则返回partialStringPtr;如果NO不可接受,则返回partialStringPtr。如果您要替换字符串并更改选择范围,请将新字符串分配给partialStringPtr,将新范围分配给proposedSelRangePtr并返回NO

因此,如果用户尝试插入不允许的字符,您可以完全拒绝其编辑,也可以修改它以删除那些不允许的字符。 (请注意,用户更改可以包括粘贴,因此它不一定只是一个类型字符。)要完全拒绝更改,请将origString分配给*partialStringPtrorigSelRange { {1}}。