Macos 单击NSAttributedString后恢复其可视状态
我需要在单击NSAttributedString后恢复其可视状态 我的NSAttributedString包含属于范围的链接 在本例中,文本“@user”具有指向的链接htpp://somesite.com/“: 它运行良好:单击文本字段中的“@user”,它将启动URL 但单击后,属性颜色将消失并替换为蓝色,并添加下划线: 我找不到一个解决方案来在单击字符串后恢复原始颜色(或者完全避免这种自动更改) 我已经看到了,但是没有实际的解决方案,我无法将指向的库集成到我的项目中(实际上,我真的希望不必导入任何库)Macos 单击NSAttributedString后恢复其可视状态,macos,cocoa,nsattributedstring,nstextfield,nstextview,Macos,Cocoa,Nsattributedstring,Nstextfield,Nstextview,我需要在单击NSAttributedString后恢复其可视状态 我的NSAttributedString包含属于范围的链接 在本例中,文本“@user”具有指向的链接htpp://somesite.com/“: 它运行良好:单击文本字段中的“@user”,它将启动URL 但单击后,属性颜色将消失并替换为蓝色,并添加下划线: 我找不到一个解决方案来在单击字符串后恢复原始颜色(或者完全避免这种自动更改) 我已经看到了,但是没有实际的解决方案,我无法将指向的库集成到我的项目中(实际上,我真的希望
请注意,我的现有代码是Swift,但我可以使用Objective-C解决方案。单击链接时,文本将由字段编辑器显示。字段编辑器中的默认链接文本样式为蓝色并带下划线 解决方案1:在
NSTextFieldCell
子类中的setUpFieldEditorAttributes:
重写中更改链接的文本样式
- (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是窗口的委托)
解决方案3:创建NSTextFieldCell
的子类,实现fieldEditorForView:
并返回您自己的字段编辑器。这与解决方案2类似,但由单元格而不是窗口委托实现
关于字段编辑器的文档:和。第一个解决方案:非常好。不过,副作用有点问题。有没有办法从那里获取链接本身?我将能够过滤其类型并设置正确的颜色我不明白你的第二个解决方案,对不起,如果你能解释的话…:p
NSTextFieldCell
还有一个属性attributedStringValue
。这真的很好,提供了多种方法,我喜欢。非常感谢。发生了一件非常奇怪的事情:我问题中的代码不再工作,链接总是蓝色的,即使没有点击,所以我不能再使用你的解决方案。请看你是否有几分钟的时间,我对此很困惑。。。
- (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;
}
@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;
}