单击后,我需要恢复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”,它将启动URL。
但是,一旦单击,归属的颜色就会消失,并由该蓝色代替,并添加下划线:
单击字符串后(或者避免完全自动更改),我找不到恢复原色的解决方案。
我已经看到了这个和这个,但没有实际的解决方案,我不能在尖库集成到我的项目(我真的希望没有导入任何图书馆,实际上)。
请注意,我现有的代码在Swift中,但是我可以使用Objective-C解决方案。
单击链接后,字段编辑器将显示文本。字段编辑器中的默认链接文本样式为蓝色并带有下划线。
解决方案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,但由单元而不是窗口委托来实现。
字段编辑器上的文档:文本字段,文本视图,字段编辑器和使用自定义字段编辑器。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句