限制 NSTextField 上的输入
Restrict input on 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;
}
}
}
}
它可以工作,但并不是真正的最佳选择,因为如果尝试输入无效字符,文本光标仍会移动一个 space。我也认为循环不是必需的,所以我想知道是否有人知道更优雅的解决方案?
您可以完全控制 NSFormatter
的子类。我不确定你为什么不这么认为。
覆盖 isPartialStringValid(_:proposedSelectedRange:originalString:originalSelectedRange:errorDescription:)
并实现所需的逻辑。来自 docs(由我进行了一些小的编辑):
In a subclass implementation, evaluate [the string pointed to by *partialStringPtr
] according to the context. Return YES
if partialStringPtr
is acceptable and NO
if partialStringPtr
is unacceptable. Assign a new string to partialStringPtr
and a new range to proposedSelRangePtr
and return NO
if you want to replace the string and change the selection range.
因此,如果用户试图插入不允许的字符,您可以完全拒绝他们的编辑或修改它以去除那些不允许的字符。 (请记住,用户更改可以包括粘贴,因此它不一定只是单个键入的字符。)要完全拒绝更改,请将 origString
分配给 *partialStringPtr
并将 origSelRange
分配给 *proposedSelRangePtr
.
我想在 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;
}
}
}
}
它可以工作,但并不是真正的最佳选择,因为如果尝试输入无效字符,文本光标仍会移动一个 space。我也认为循环不是必需的,所以我想知道是否有人知道更优雅的解决方案?
您可以完全控制 NSFormatter
的子类。我不确定你为什么不这么认为。
覆盖 isPartialStringValid(_:proposedSelectedRange:originalString:originalSelectedRange:errorDescription:)
并实现所需的逻辑。来自 docs(由我进行了一些小的编辑):
In a subclass implementation, evaluate [the string pointed to by
*partialStringPtr
] according to the context. ReturnYES
ifpartialStringPtr
is acceptable andNO
ifpartialStringPtr
is unacceptable. Assign a new string topartialStringPtr
and a new range toproposedSelRangePtr
and returnNO
if you want to replace the string and change the selection range.
因此,如果用户试图插入不允许的字符,您可以完全拒绝他们的编辑或修改它以去除那些不允许的字符。 (请记住,用户更改可以包括粘贴,因此它不一定只是单个键入的字符。)要完全拒绝更改,请将 origString
分配给 *partialStringPtr
并将 origSelRange
分配给 *proposedSelRangePtr
.