我是初级MacOS开发人员。 在Swift 4 Cocoa中,我想让Text Field对Shift键进行“特殊”处理。
默认情况下,如果输入一个字母,它应该是大写的但是如果按下Shift键,则字母应为小写。
例:
我能够用
强制大写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键时,我不知道如何“强制”小写。
我非常感谢你的阅读和帮助。
答案 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处理。字段编辑器是NSTextView
,NSTextView
实现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
。