Cocoa 可可中的超链接
我正在用XCode开发一个Mac应用程序。我需要添加一个超链接,导航到一个特定的网站。我用一个按钮尝试了这一点,但我需要知道当鼠标位于该按钮上时如何将光标更改为手动光标。要设置光标,必须使用光标跟踪方法Cocoa 可可中的超链接,cocoa,hyperlink,Cocoa,Hyperlink,我正在用XCode开发一个Mac应用程序。我需要添加一个超链接,导航到一个特定的网站。我用一个按钮尝试了这一点,但我需要知道当鼠标位于该按钮上时如何将光标更改为手动光标。要设置光标,必须使用光标跟踪方法addCursorRect:cursor:。但是,您实际上只能从resetCursorRects方法内部调用该方法。如果你在其他任何时候这样做,它基本上都会被忽略 因此,这意味着您需要子类化NSButton(或您想要使用的任何NSView子类)并覆盖resetCursorRects,以调用整个视图
addCursorRect:cursor:
。但是,您实际上只能从resetCursorRects
方法内部调用该方法。如果你在其他任何时候这样做,它基本上都会被忽略
因此,这意味着您需要子类化
NSButton
(或您想要使用的任何NSView
子类)并覆盖resetCursorRects
,以调用整个视图的边界的addCursorRect:cursor:
,我相信您可以使用不可编辑的NSTextField来显示URL。如果在设置为字段的value属性的NSAttributedString上适当地设置属性,它将显示为带下划线的标准蓝色,并为您处理光标跟踪。苹果问答会告诉你如何设置URL的属性。我想为下一个偶然发现的人提供一个更新的答案
我发现,当我尝试Barry的答案中苹果问答指定的解决方案时,我的标签链接的文本会在点击时收缩。经过一些调试后,我发现Apple文章中的示例代码设置了一个新的属性字符串,但一开始并没有保留label控件上的任何原始属性。解决方案是从标签的原始属性字符串的副本开始,添加新的超链接属性,然后更新标签
我制作了一个简单的助手函数,可以将NSTextField标签转换为超链接。它基本上整合了苹果页面上的解决方案,而无需向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];
}
然后,要调用它,请在窗口初始化时将NSTextField和url字符串传递给它:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
[self updateControl:_label withHyperlink:@"http://www.stackoverflow.com"];
}
本Apple tech便笺唯一的问题是鼠标光标仍然会变为鼠标上方的I-beam文本输入样式光标。还有一个问题是,单击链接会将NSTextField的字体更改为系统默认字体。以下内容通过强制文本继承文本字段的字体为我修复了该问题:[attString addAttribute:NSFontAttributeName value:[label font]range:NSMakerRange(0[attString length])代码>非常适合我,谢谢。我已将NSTextField子类化。