点击它后,我需要恢复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”,它会启动网址。
但点击后,属性颜色会消失,并被此蓝色替换,并添加下划线:
单击字符串后,我找不到恢复原始颜色的解决方案(或者为了避免完全自动更改)。
我见过this和this但是没有实际的解决方案,我无法将指向的库集成到我的项目中(我真的不想导入任何库,实际上)。
请注意,我现有的代码在Swift中,但我可以使用Objective-C解决方案。
答案 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
委托方法替换您自己的字段编辑器。文本字段有自己的字段编辑器,其他控件没有橙色链接。不需要NSTextField
或NSTextFieldCell
的子类。
示例:( 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 Editor和Using a Custom Field Editor。