2009-06-11 31 views
5

Tôi đang phát triển ứng dụng Mac trong XCode. Tôi cần phải thêm một siêu liên kết điều hướng đến một trang web cụ thể. Tôi đã thử điều này bằng cách sử dụng một nút, nhưng tôi cần phải biết làm thế nào để thay đổi con trỏ để con trỏ tay khi chuột là trên nút đó.Siêu kết nối trong Cocoa

Trả lời

8

Tôi tin rằng bạn có thể sử dụng NSTextField không thể chỉnh sửa để hiển thị URL. Nếu bạn đặt các thuộc tính một cách thích hợp trên NSAttributedString mà bạn đặt làm thuộc tính giá trị của trường, nó sẽ hiển thị dưới dạng tiêu chuẩn màu xanh-với-gạch chân và xử lý theo dõi con trỏ cho bạn. This Apple Q & A cho bạn biết cách đặt thuộc tính cho URL.

+0

Vấn đề duy nhất với ghi chú công nghệ Apple này là con trỏ chuột vẫn thay đổi con trỏ kiểu nhập văn bản I-beam khi di chuột qua. –

+0

Một vấn đề nữa là việc nhấp vào liên kết sẽ thay đổi phông chữ của NSTextField thành mặc định của hệ thống. Các sửa chữa sau đây trục trặc cho tôi bằng cách buộc văn bản kế thừa phông chữ của trường văn bản: '[attString addAttribute: NSFontAttributeName value: [label font] range: NSMakeRange (0, [attString length])];' –

4

Để đặt con trỏ, bạn phải sử dụng phương pháp theo dõi con trỏ addCursorRect:cursor:. Tuy nhiên, bạn thực sự chỉ cần gọi phương thức đó từ bên trong phương thức resetCursorRects. Nếu bạn làm điều đó vào bất kỳ thời điểm nào khác, về cơ bản nó được bảo đảm để bị bỏ qua.

Vì vậy, đây có nghĩa là bạn cần phải phân lớp NSButton (hoặc bất kỳ NSView lớp con bạn muốn sử dụng) và ghi đè resetCursorRects gọi addCursorRect:cursor: cho toàn bộ quan điểm của bounds.

+0

Làm việc đối với tôi một cách hoàn hảo, cảm ơn. Tôi đã phân lớp NSTextField. –

2

Tôi muốn đưa ra một câu trả lời được cập nhật cho bất cứ ai tình cờ gặp vấn đề này tiếp theo.

Tôi thấy rằng khi tôi thử giải pháp được chỉ định bởi Apple Q & A trong câu trả lời của Barry, rằng văn bản của liên kết nhãn của tôi sẽ co lại khi được nhấp. Sau khi một số gỡ lỗi, tôi đã tìm ra rằng mã mẫu trên bài viết của Apple đã thiết lập một chuỗi được phân bổ mới, nhưng không bảo tồn bất kỳ thuộc tính ban đầu nào trên điều khiển nhãn để bắt đầu. Giải pháp là chỉ cần bắt đầu với một bản sao của chuỗi phân bổ ban đầu của nhãn, thêm các thuộc tính siêu liên kết mới, và sau đó cập nhật nhãn.

Tôi đã tạo một hàm trợ giúp đơn giản để biến nhãn NSTextField thành siêu kết nối. Về cơ bản nó củng cố giải pháp trên trang của Apple mà không cần thêm phần mở rộng danh mục vào NSAttributeString.

// Converts an otherwise plain NSTextField label into a hyperlink 
-(void)updateControl:(NSTextField*)control withHyperlink:(NSString*)strURL 
{ 
    // both are needed, otherwise hyperlink won't accept mousedown 
    [control setAllowsEditingTextAttributes: YES]; 
    [control setSelectable: YES]; 

    NSURL* url = [NSURL URLWithString:strURL]; 

    NSAttributedString* attrString = [control attributedStringValue]; 

    NSMutableAttributedString* attr = [[NSMutableAttributedString alloc] initWithAttributedString:attrString]; 
    NSRange range = NSMakeRange(0, [attr length]); 

    [attr addAttribute:NSLinkAttributeName value:url range:range]; 
    [attr addAttribute:NSForegroundColorAttributeName value:[NSColor blueColor] range:range ]; 
    [attr addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInt:NSUnderlineStyleSingle] range:range]; 

    [control setAttributedStringValue:attr]; 
} 

Và sau đó để gọi nó, vượt qua NSTextField và chuỗi url vào nó đôi khi cửa sổ khởi:

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 

    [self updateControl:_label withHyperlink:@"http://www.stackoverflow.com"]; 

} 
Các vấn đề liên quan