2016-10-03 9 views
0

Мне нужно восстановить визуальное состояние NSAttributedString после нажатия на него.Восстановить визуальное состояние NSAttributedString после нажатия на него

My 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-адрес.

enter image description here

Но однажды нажат, приписывали цвет исчезает и заменяется на этой синей и подчеркивание добавлено:

enter image description here

Я не могу найти решение для восстановления исходный цвет после щелчка по строке (или во избежание автоматического изменения этого параметра).

Я видел this и, но фактического решения нет, и я не могу интегрировать указанную библиотеку в свой проект (мне бы очень хотелось, чтобы на самом деле не нужно было импортировать какую-либо библиотеку).

Обратите внимание, что мой существующий код находится в Swift, но я могу использовать решение Objective-C.

ответ

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.

+0

Первое решение: очень приятно. Однако побочный эффект - это немного проблема. Есть ли способ получить ссылку оттуда? Я бы смог отфильтровать его тип и установить правильный цвет. // Я не понимаю ваше второе решение, извините, если вы можете объяснить ...: p – Moritz

+0

'NSTextFieldCell' также имеет свойство' attribitedStringValue'. – Willeke

+0

Тем временем я отредактировал свой ответ. – Willeke