2011-12-30 10 views
6

コントローラにバインドされているIBにLabel(NSTextField)があります。 コントローラは、awakeFromNIB上で、ラベルのattributedStringValueに色付きテキストと1つまたは複数のリンクを含むように設定します。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

:私は私のテキストフィールドのためにIBに設定していたフォントを一致NSFontオブジェクトを作成し、そのようにその属性を設定します文字列。これらのメソッドは、NSTextViewの 'NSTextStorage'のように文字列が変更を監視されている場合にのみ使用されます。 –

+0

また、テキストフィールドがコントローラに「バインド」されているとします。 「束縛」という言葉の使用は、あなたがココアの束縛を使用していることを意味しますが、テキストフィールドの値をプログラム的に設定するので、そうではないようです。テキストフィールドの 'attributedStringValue'バインディングは実際に何かに束縛されていますか? –

+0

@RobKenigerこれは、「バインドされた」IBOutletです(そのための正しい用語は何ですか?) – d2kagw

答えて

0

私が知る限り、それはちょうど普通のAppKit奇妙なことです。

私はあなただけのインターフェイスビルダーでそれを追加し、通常のようにその帰属文字列値を設定し、リンクなどのテキストフィールドをレンダリングするために、このカスタムクラスを使用して成功を収めてきました:

DSClickableURLTextField

あなたはまた、オプションを持っていますNSButtonを使用していますが、これは痛みが増し、余分な作業をしなくても手カーソルを取得することはできません。

4

この同じ問題が発生しました。私が見つけた解決策は、属性付き文字列にNSFontAttributeNameを明示的に設定することでした。あなたが帰属構築されているときには、 `beginEditing`と` endEditing`を呼び出す必要はありません

NSFont *font = [NSFont fontWithName:@"Lucida Grande" size:(CGFloat)13.0]; 
[attrString addAttribute:NSFontAttributeName value:font range:range]; 
関連する問題