Атрибутивная строка NSTextField задерживается при рендеринге - PullRequest
6 голосов
/ 31 декабря 2011

У меня есть метка (NSTextField) в IB, которая связана с контроллером. Контроллер на awakeFromNIB устанавливает значение атрибута attributedStringValue для содержания некоторого цветного текста и одной или двух ссылок.

Когда вы видите метку, она содержит правильное строковое значение, но часть форматирования теряется - пока вы не нажмете на метку, и она не обновится, чтобы содержать правильное форматирование.

Я использую этот код для установки значения:

[self.testTextField setAllowsEditingTextAttributes:YES];
[self.testTextField setSelectable:YES];
NSMutableAttributedString *linkString = [[NSMutableAttributedString alloc] initWithString:@"hit this "];

[linkString beginEditing];

NSMutableAttributedString* attrString = [[NSMutableAttributedString alloc] initWithString:@"link"];
NSRange range = NSMakeRange(0, [attrString length]);

[attrString addAttribute:NSLinkAttributeName value:[[NSURL URLWithString:@"http://google.com"] absoluteString] range:range];
[attrString addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInt:NSUnderlinePatternDot] range:range];
[attrString addAttribute:NSForegroundColorAttributeName value:[NSColor blackColor] range:range];
[linkString appendAttributedString:attrString];

[linkString appendAttributedString:[[NSAttributedString alloc] initWithString:@" to search"]];

[linkString addAttribute:NSForegroundColorAttributeName value:[NSColor redColor] range:NSMakeRange(0, [linkString length])];

[linkString endEditing];

[self.testTextField setAttributedStringValue:linkString];

На основе этого примера вы увидите строку, окрашенную в красный цвет, и шрифтом Label по умолчанию. Затем, когда вы нажимаете на ярлык, шрифт меняет размер и лицо, и ссылка волшебным образом отображается.

Есть какие-нибудь идеи о том, как правильно отобразить строку в первый раз?

Ответы [ 2 ]

4 голосов
/ 12 октября 2012

Я столкнулся с этой же проблемой. Решение, которое я нашел, состояло в том, чтобы явно установить NSFontAttributeName для приписанной строки. Я создал объект NSFont, который соответствует шрифту, который я установил в IB для моего текстового поля, и установил этот атрибут следующим образом:

NSFont *font = [NSFont fontWithName:@"Lucida Grande" size:(CGFloat)13.0];
[attrString addAttribute:NSFontAttributeName value:font range:range];
0 голосов
/ 31 декабря 2011

Насколько я знаю, это просто странная странность AppKit.

Я успешно использовал этот пользовательский класс для рендеринга текстовых полей в виде ссылок, вы просто добавили его в конструктор интерфейса и задали его атрибутное строковое значение, как обычно:

DSClickableURLTextField

У вас также есть возможность использовать NSButton, хотя это более болезненно, и вы не получите курсор в виде руки без дополнительной работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...