按下shift键时强制小写

时间:2017-10-15 14:56:22

标签: swift macos cocoa

我是初级MacOS开发人员。 在Swift 4 Cocoa中,我想让Text Field对Shift键进行“特殊”处理。

默认情况下,如果输入一个字母,它应该是大写的但是如果按下Shift键,则字母应为小写。

例:

    输入
  • “a” - >转变为“A”
  • 输入Shift +“a” - >转变为“一个”
  • 任何其他条目(号码等)应正常处理 -

我能够用

强制大写
override func controlTextDidChange(_ obj: Notification) {
    print("Text changed")

    var infoDictionary:Dictionary = obj.userInfo! as Dictionary
    let text:NSText = infoDictionary["NSFieldEditor"] as! NSText
    text.string = text.string.uppercased()
}

但是,当按下shift键时,我不知道如何“强制”小写。

我非常感谢你的阅读和帮助。

2 个答案:

答案 0 :(得分:0)

在输入阶段解决任务,而不是在文本输入字段后。也就是说,在将传入的键事件插入文本字段之前将其转换为。

Apple使用字段编辑器设置,在编辑时有效地用NSTextField替换任何NSTextView。该过程在Working with the Field Editor中进行了解释,概述为:

  • 您定义了一个NSTextView的子类,它会在调用重写方法(keyDown:)之前覆盖[super ...]根据需要修改字符大小写。您的覆盖将通过未修改的已接收NSEvent或构建一个新的案例修改。

  • 包含文本字段的窗口负责设置字段编辑器。在窗口委托中,您实现了委托方法windowWillReturnFieldEditor:toObject:。如果此方法的第二个参数是您希望对其进行特殊处理的文本字段,则返回NSTextView子类的实例,并将其fieldEditor属性设置为YES。否则,您将返回nil

  • 识别需要特殊处理的文本字段的简单方法是声明NSTextField的空子类,并将其用于特殊文本字段。您的窗口委托方法现在可以进行类型测试。

如果您在解决问题时遇到问题,请提出一个新问题,说明您开发的代码,解释您的问题等等,毫无疑问,有人会帮助您完成下一步。

HTH

答案 1 :(得分:0)

文本字段中的击键由The Field Editor处理。字段编辑器是NSTextViewNSTextView实现NSTextInputClient协议。创建NSTextView的子类并覆盖insertText(_:replacementRange:)以更改输入字符串的大小写。

class MyTextView: NSTextView {

    override func insertText(_ string: Any, replacementRange: NSRange) {
        var newString = string

        if let oldString = string as? String {
            if (NSApp.currentEvent?.modifierFlags.contains(.shift))! {
                newString = oldString.lowercased()
            }
            else {
                newString = oldString.uppercased()
            }
        }
        // handle string is a NSAttributedString

        super.insertText(newString, replacementRange:replacementRange)
    }

}

子类NSTextFieldCell并覆盖fieldEditor(for:)以返回NSTextView的子类的实例。

class MyTextFieldCell: NSTextFieldCell {

    var myFieldEditor:MyTextView? = nil

    override func fieldEditor(for controlView: NSView) -> NSTextView? {
        if (myFieldEditor == nil) {
            myFieldEditor = MyTextView()
            myFieldEditor?.isFieldEditor = true
        }
        return myFieldEditor  
    }

}

将文本字段的单元格类设置为MyTextFieldCell