2011-12-30 61 views
6

我在IB中有一個綁定到控制器的Label(NSTextField)。 控制器在awakeFromNIB上設置標籤的attributesStringValue以包含一些彩色文本和一個或兩個鏈接。NSTextField的歸因字符串在渲染中延遲

當您看到標籤時,它包含正確的字符串值,但是某些格式會丟失 - 直到您單擊標籤並更新爲包含正確的格式。

我使用這個代碼來設置值:

[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]; 

基於這個例子中,你會看到紅色和默認標籤字體的字符串。 然後當你點擊標籤時,字體會改變大小和臉部,鏈接會神奇地呈現。

關於如何讓字符串第一次正確呈現的任何想法?

+0

當你正在構建一個原因你並不需要調用'beginEditing'和'endEditing'串。這些方法僅用於監視字符串的變化,例如'NSTextView'的'NSTextStorage'。 – 2011-12-30 23:51:10

+0

此外,你說文本字段是「綁定」到控制器。 「綁定」一詞的使用意味着您使用的是Cocoa Bindings,但您似乎並非如此,因爲您正在以編程方式設置文本字段的值。文本字段的「attributesStringValue」綁定實際上是否綁定了任何內容? – 2011-12-30 23:54:06

+0

@RobKeniger這是一個IBOutlet是'綁定'(這是什麼權利?) – d2kagw 2011-12-31 02:52:51

回答

0

據我所知,這只是正常的AppKit怪異。

我已經使用這個自定義類來呈現文本字段作爲鏈接取得了成功,你只需要添加它在界面生成器並設置其屬性串值正常人一樣:

DSClickableURLTextField

您也可以選擇使用NSButton,雖然這更加痛苦,並且沒有額外的工作就不會獲得手形光標。

4

我遇到了同樣的問題。我找到的解決方案是顯式設置屬性字符串NSFontAttributeName。我創建了匹配我曾在IB我的文本字段設置和設置等,使得屬性的字體的NSFont對象:

NSFont *font = [NSFont fontWithName:@"Lucida Grande" size:(CGFloat)13.0]; 
[attrString addAttribute:NSFontAttributeName value:font range:range];