【问题标题】:Restrict input on NSTextField限制 NSTextField 上的输入
【发布时间】:2015-06-17 06:39:04
【问题描述】:

我想限制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;
            }
        }
    }
}

它可以工作,但并不是真正的最佳选择,因为如果尝试输入无效字符,文本光标仍会移动一个空格。我也认为循环不应该是必要的,所以我想知道有人知道一个更优雅的解决方案吗?

【问题讨论】:

    标签: macos swift cocoa nstextfield


    【解决方案1】:

    您可以完全控制NSFormatter 的子类。我不知道你为什么认为你没有。

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

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

    因此,如果用户尝试插入不允许的字符,您可以完全拒绝他们的编辑,也可以对其进行修改以去除那些不允许的字符。 (请记住,用户更改可以包括粘贴,因此不一定只是单个键入的字符。)要完全拒绝更改,请将origString 分配给*partialStringPtr,将origSelRange 分配给*proposedSelRangePtr

    【讨论】:

    • 这比使用目标/动作机制更好,因为它分离了责任区域。这是使用 Cocoa Bindings 时的关键(双关语),它完全排除了目标/动作机制,这意味着格式化程序是您在输入接近模型对象之前对其进行清理的唯一机会。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-29
    • 2022-01-05
    • 2013-05-19
    • 1970-01-01
    • 2014-03-01
    • 2015-01-31
    相关资源
    最近更新 更多