单击NSAttributedString后恢复其视觉状态

埃里克·艾亚(Eric Aya)

单击后,我需要恢复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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

转换后,CSS Cube恢复到其初始状态

来自分类Dev

滑动以在iOS中显示后尝试使表格单元格恢复其原始状态

来自分类Dev

加载jsTree树并恢复其状态后,可以使用cookie来运行代码吗?

来自分类Dev

单击后重置链接状态

来自分类Dev

方向改变后片段恢复状态

来自分类Dev

引导后立即恢复小部件状态

来自分类Dev

恢复操作后获取更新状态

来自分类Dev

引导后立即恢复小部件状态

来自分类Dev

绘制后如何恢复QPainter的状态

来自分类Dev

从休眠状态恢复后,LTS暂停16.04

来自分类Dev

Gitlab在恢复后不返回初始状态

来自分类Dev

失败后make如何恢复状态

来自分类Dev

从崩溃中恢复时会记住其状态的bash终端

来自分类Dev

孩子退出后如何获得其状态?

来自分类Dev

nuGet恢复后,如何使MonoDevelop更新其缓存?

来自分类Dev

ClickableSpan TextView在单击后保持选中状态

来自分类Dev

jQuery单击功能后保存当前状态

来自分类Dev

单击后,SemanticUI按钮仍处于活动状态

来自分类Dev

重复单击后回到加热状态?

来自分类Dev

单击菜单项后恢复汉堡动画

来自分类Dev

CheckBox在取消选中后恢复为选中状态

来自分类Dev

使用react hooks提交失败后恢复表单提交状态

来自分类Dev

从待机状态恢复后,铬会冻结(Kubuntu 14.04)

来自分类Dev

从休眠状态恢复后重新启动Network Manager的脚本

来自分类Dev

从休眠状态恢复后,Networkmanager不知道我在线

来自分类Dev

从待机状态恢复后,HDMI上的声音慢2倍

来自分类Dev

断开连接后,在状态dsInsert中恢复TADOQuery

来自分类Dev

故障转移和恢复后的copySet db状态

来自分类Dev

断电后将 CentOS 文件恢复到以前的状态

Related 相关文章

热门标签

归档