2011-12-30 14 views
6

Tôi có một Nhãn (NSTextField) trong IB được gắn với bộ điều khiển. Bộ điều khiển, trên awakeFromNIB, đặt attributedStringValue của nhãn để chứa một số văn bản màu và một hoặc hai liên kết.Chuỗi được phân bổ của NSTextField bị trễ trong việc hiển thị

Khi bạn thấy nhãn chứa giá trị chuỗi chính xác nhưng một số định dạng bị mất - cho đến khi bạn nhấp vào nhãn và nhãn sẽ cập nhật để chứa định dạng chính xác.

Tôi đang sử dụng mã này để thiết lập giá trị:

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

Dựa trên ví dụ này, bạn sẽ thấy chuỗi màu đỏ và font Label mặc định. Sau đó, khi bạn nhấp vào nhãn, phông chữ thay đổi kích thước và khuôn mặt và liên kết sẽ hiển thị một cách kỳ diệu.

Bất kỳ ý tưởng nào về cách để chuỗi hiển thị chính xác lần đầu tiên?

+0

Bạn không cần phải gọi 'beginEditing' và' endEditing' khi bạn đang xây dựng một thuộc tính chuỗi. Các phương thức này chỉ được sử dụng khi chuỗi đang được theo dõi để thay đổi, chẳng hạn như 'NSTextStorage' cho' NSTextView'. –

+0

Ngoài ra, bạn nói trường văn bản là "bị ràng buộc" với bộ điều khiển. Việc sử dụng từ "ràng buộc" ngụ ý rằng bạn đang sử dụng Bindings Cocoa, nhưng có vẻ như bạn không phải, vì bạn đang thiết lập giá trị của trường văn bản theo lập trình. Có phải ràng buộc 'attributedStringValue' của trường văn bản thực sự ràng buộc với bất kỳ thứ gì không? –

+0

@RobKeniger Đó là một IBOutlet được 'ràng buộc' (thuật ngữ thích hợp cho điều đó là gì?) – d2kagw

Trả lời

0

Theo như tôi biết đó chỉ là sự kỳ quặc AppKit bình thường.

Tôi đã thành công sử dụng lớp tùy chỉnh này để render các lĩnh vực văn bản như liên kết, bạn chỉ cần thêm nó trong xây dựng giao diện và thiết lập chuỗi giá trị do nó giống như bình thường:

DSClickableURLTextField

Bạn cũng có tùy chọn sử dụng một số NSButton, mặc dù đó là một nỗi đau, và bạn không có được con trỏ tay mà không cần thêm công việc.

4

Tôi đã gặp phải sự cố tương tự này. Giải pháp tôi tìm thấy là đặt rõ ràng NSFontAttributeName trên chuỗi được phân bổ. Tôi đã tạo một đối tượng NSFont khớp với phông chữ mà tôi đã đặt trong IB cho trường văn bản của tôi và đặt thuộc tính đó như vậy:

NSFont *font = [NSFont fontWithName:@"Lucida Grande" size:(CGFloat)13.0]; 
[attrString addAttribute:NSFontAttributeName value:font range:range]; 
Các vấn đề liên quan