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

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

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

[NSString数据使用编码:NSASCIIStringEncoding allowLossyConversion:是]

但它的解决方案是完全删除报价


我已尝试更改系统首选项-->键盘-->文本中的“使用智能引号和破折号”设置。当编辑
NSTextField
时,它有一个处理实际编辑的
NSTextView
子视图。此子视图称为“字段编辑器”

NSTextView
有一个
automaticQuoteSubstitutionEnabled
属性。要为字段编辑器关闭此属性

您可以通过创建
NSTextFieldCell
的子类并重写
setUpFieldEditorAttributes
方法来完成此操作。在Swift中:

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
    。对于其他字段,返回nil


如果使用单独的字段编辑器解决方案,则可能不必使用自定义的
NSTextFieldCell
子类。只需将特殊字段编辑器的
isAutomaticQuoteSubstitutionEnabled
设置为false,然后再返回它。

当编辑
NSTextField
时,它有一个
NSTextView
子类处理实际编辑的视图。此子视图称为“字段编辑器”

NSTextView
有一个
automaticQuoteSubstitutionEnabled
属性。要为字段编辑器关闭此属性

您可以通过创建
NSTextFieldCell
的子类并重写
setUpFieldEditorAttributes
方法来完成此操作。在Swift中:

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
    。对于其他字段,返回nil


如果使用单独的字段编辑器解决方案,则可能不必使用自定义的
NSTextFieldCell
子类。只需将特殊字段编辑器的
isAutomaticQuoteSubstitutionEnabled
设置为false,然后再返回它。

我尝试了您建议的两种变体(空格限制为第一个):-(无效)ApplicationIDFinishLaunching:(NSNotification)通知{TextEditorNoAQSub=[[NSTextView alloc]init];//NSTextView TextEditorNoAQSub.automaticQuoteSubstitutionEnabled的控制器类成员;}-(id)windowWillReturnFieldEditor:(NSWindow*)发送者对象:(id)客户端{return textViewEditorNoutoQuoteSub;}编辑行为更改(文本在上消失),但ASCII编码仍然失败。第二个变量:`-(id)windowWillReturnFieldEditor:(NSWindow*)sender toObject:(id)客户端{if(client==TextFieldOutputFormat){NSText*defaultFieldEditor=[myWindow fieldEditor:NO forObject:nil];如果([defaultFieldEditor isKindOfClass:[NSTextView class]]==YES){NSTextView*defaultFieldEdAsTV=(NSTextView*)defaultFieldEditor;defaultFieldEdAsTV.automaticQuoteSubstitutionEnabled=NO;}}}返回nil;}`我尝试了您建议的两种变体