2011-12-30 6 views
6

Mam etykietę (NSTextField) w IB, która jest przypisana do kontrolera. Sterownik, w przebudzeniu z NIB, ustawia atrybut attributedStringValue etykiety, aby zawierał kolorowy tekst i łącze lub dwa.Przypisany ciąg NSTextextield jest opóźniony w renderowaniu.

Gdy zobaczysz etykietę, zawiera ona prawidłową wartość ciągu, ale część formatowania zostanie utracona - dopóki nie klikniesz etykiety i zostanie ona zaktualizowana, aby zawierała prawidłowe formatowanie.

używam tego kodu, aby ustawić wartość:

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

w oparciu o ten przykład, zobaczysz ciąg zabarwiony na czerwono i czcionki w domyślnym Label. Następnie, po kliknięciu na etykietę, czcionka zmienia rozmiar i twarz, a link jest renderowany w magiczny sposób.

Jakieś pomysły, w jaki sposób uzyskać prawidłowe renderowanie napisu za pierwszym razem?

+0

Nie musisz nazywać '' endEditing' beginEditing' i podczas konstruowania nadana strunowy. Te metody są używane tylko wtedy, gdy ciąg jest monitorowany pod kątem zmian, takich jak 'NSTextStorage' dla' NSTextView'. –

+0

Mówisz również, że pole tekstowe jest "powiązane" z kontrolerem. Użycie słowa "związany" oznacza, że ​​używasz wiązania kakao, ale wygląda na to, że nie jesteś, ponieważ programujesz wartość pola tekstowego. Czy powiązanie "attributedStringValue" pola tekstowego jest z niczym związane? –

+0

@RobKeniger To IBOutlet, który jest "związany" (co to jest właściwe określenie?) – d2kagw

Odpowiedz

0

O ile mi wiadomo, jest to zwyczajna dziwaczność AppKit.

miałem powodzenia przy użyciu tej niestandardowej klasy, aby uczynić pól tekstowych jak linki, wystarczy dodać go w konstruktorze Interface i ustawić jej przypisać wartość ciągu jak normalny:

DSClickableURLTextField

Masz również opcję korzystania z NSButton, ale to jest więcej bólu, a nie dostaniesz kursora bez dodatkowej pracy.

4

Wpadłem na ten sam problem. Rozwiązaniem, które znalazłem, było jawne ustawienie NSFontAttributeName na przypisanym łańcuchu. I stworzył obiekt NSFont pasującego czcionkę miałem ustawione w IB dla mojego pola tekstowego i ustawić ten atrybut tak:

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