点击后恢复NSAttributedString的可视状态

时间:2016-10-03 11:34:43

标签: macos cocoa nsattributedstring nstextfield nstextview

点击它后,我需要恢复NSAttributedString的可视状态。

我的NSAttributedString包含属于范围的链接。

在此示例中,文本“@user”有一个指向“htpp://somesite.com/”的链接:

let text = "Hey @user!"

let attr = NSMutableAttributedString(string: text)
let range = NSRange(location: 4, length: 5)
attr.addAttribute(NSForegroundColorAttributeName, value: NSColor.orange, range: range)
attr.addAttribute(NSLinkAttributeName, value: "htpp://somesite.com/", range: range)

let tf = NSTextField(frame: NSRect(x: 0, y: 0, width: 200, height: 50))
tf.allowsEditingTextAttributes = true
tf.isSelectable = true
tf.stringValue = text
tf.attributedStringValue = attr

效果很好:点击文本字段中的“@user”,它会启动网址。

enter image description here

但点击后,属性颜色会消失,并被此蓝色替换,并添加下划线:

enter image description here

单击字符串后,我找不到恢复原始颜色的解决方案(或者为了避免完全自动更改)。

我见过thisthis但是没有实际的解决方案,我无法将指向的库集成到我的项目中(我真的不想导入任何库,实际上)。

请注意,我现有的代码在Swift中,但我可以使用Objective-C解决方案。

1 个答案:

答案 0 :(得分:1)

单击链接时,文本将由字段编辑器显示。字段编辑器中的默认链接文本样式为蓝色并带下划线。

解决方案1:在setUpFieldEditorAttributes:的子类中更改NSTextFieldCell的覆盖中更改链接的文字样式。

- (NSText *)setUpFieldEditorAttributes:(NSText *)textObj {
    NSText *fieldEditor = [super setUpFieldEditorAttributes:textObj];
    if ([fieldEditor isKindOfClass:[NSTextView class]]) {
        NSMutableDictionary *linkAttributes = [((NSTextView *)fieldEditor).linkTextAttributes mutableCopy];
        linkAttributes[NSForegroundColorAttributeName] = [NSColor orangeColor];
        [linkAttributes removeObjectForKey:NSUnderlineStyleAttributeName];
        ((NSTextView *)fieldEditor).linkTextAttributes = linkAttributes;
    }
    return fieldEditor;
}

副作用:字段编辑器由窗口中的所有控件共享,所有控件现在都显示橙色链接。

解决方案2:使用fieldEditor:forObject:方法或windowWillReturnFieldEditor:toObject: NSWindow委托方法替换您自己的字段编辑器。文本字段有自己的字段编辑器,其他控件没有橙色链接。不需要NSTextFieldNSTextFieldCell的子类。

示例:( AppDelegate是窗口的委托)

@interface AppDelegate ()

@property (weak) IBOutlet NSWindow *window;
@property (weak) IBOutlet NSTextField *textField;
@property (nonatomic, strong) NSTextView *linkFieldEditor;

@end

@implementation AppDelegate

- (NSTextView *)linkFieldEditor {
    if (!_linkFieldEditor) {
        _linkFieldEditor = [[NSTextView alloc] initWithFrame:NSZeroRect];
        _linkFieldEditor.fieldEditor = YES;
        NSMutableDictionary *linkAttributes = [_linkFieldEditor.linkTextAttributes mutableCopy];
        linkAttributes[NSForegroundColorAttributeName] = [NSColor orangeColor];
        [linkAttributes removeObjectForKey:NSUnderlineStyleAttributeName];
        _linkFieldEditor.linkTextAttributes = linkAttributes;
    }
    return _linkFieldEditor;
}

- (id)windowWillReturnFieldEditor:(NSWindow *)sender toObject:(id)client {
    if (client == self.textField)
        return self.linkFieldEditor;
    else
        return nil;
}

解决方案3:创建NSTextFieldCell的子类,实现fieldEditorForView:并返回自己的字段编辑器。这类似于解决方案2,但是由单元格而不是窗口委托实现。

字段编辑器上的文档:Text Fields, Text Views, and the Field EditorUsing a Custom Field Editor