我可以强制NSTextField使用ASCII引号而不是unicode吗?

时间:2018-02-24 01:02:48

标签: xcode macos

我有一个NSTextField来收集格式字符串,用于创建一些文本然后保存到文件中。如果我在NSTextField中输入双引号(“),则来自NSTextField.stringValue的字符串被编码为0xe2 0x80 0x9d,这是双引号的unicode。如果我尝试将结果字符串保存到文件,使用NSASCIIStringEncoding,它会抱怨编码失败。我可以强制NSTextEdit将ASCII字符用于双引号,0x22吗?我尝试过有损转换:

[NSString dataUsingEncoding:NSASCIIStringEncoding        allowLossyConversion:YES]

但其解决方案是完全删除引用。

我尝试更改系统偏好设置中的“使用智能引号和短划线”设置 - >键盘 - >文本

1 个答案:

答案 0 :(得分:0)

正在编辑NSTextField时,它有一个NSTextView子视图,用于处理实际编辑。该子视图称为“字段编辑器”。

NSTextView具有automaticQuoteSubstitutionEnabled属性。您想为场编辑器关闭此功能。

您可以通过创建NSTextFieldCell的子类并覆盖setUpFieldEditorAttributes方法来完成此操作。在斯威夫特:

class MyTextFieldCell: NSTextFieldCell {

    override func setUpFieldEditorAttributes(_ textObj: NSText) -> NSText {
        super.setUpFieldEditorAttributes(textObj)
        if let textView = textObj as? NSTextView {
            textView.isAutomaticQuoteSubstitutionEnabled = false
        }
        return textObj
    }

}

在你的xib中,选择文本字段的单元格,并将其自定义类设置为MyTextFieldCell

默认情况下,每个窗口都有一个由窗口中所有文本字段共享的字段编辑器。因此,在一个文本字段具有键盘焦点之后,使用此自定义单元子类将具有关闭该窗口中所有文本字段的智能引号的效果。如果那不是你想要的,那么你需要为一个你想要没有智能引号的文本字段使用单独的字段编辑器。

要为特殊文本字段使用单独的字段编辑器,您有两种选择:

  • 创建NSWindow子类。在子类中,覆盖fieldEditor:forObject:为要禁用智能引号的字段返回单独的NSTextView,并为正常字段返回[super fieldEditor:createFlag forObject:object]

  • 给你的窗口一个委托(如果它还没有委托)。在委托中,如果字段(windowWillReturnFieldEditor:toObject:参数)应禁用智能引号,请实现NSTextView以返回单独的client。其他领域的回报为零。

如果使用单独的字段编辑器解决方案,则可能不必使用自定义NSTextFieldCell子类。您可以在返回之前将特殊字段编辑器的isAutomaticQuoteSubstitutionEnabled设置为false。