Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 可可中的超链接_Cocoa_Hyperlink - Fatal编程技术网

Cocoa 可可中的超链接

Cocoa 可可中的超链接,cocoa,hyperlink,Cocoa,Hyperlink,我正在用XCode开发一个Mac应用程序。我需要添加一个超链接,导航到一个特定的网站。我用一个按钮尝试了这一点,但我需要知道当鼠标位于该按钮上时如何将光标更改为手动光标。要设置光标,必须使用光标跟踪方法addCursorRect:cursor:。但是,您实际上只能从resetCursorRects方法内部调用该方法。如果你在其他任何时候这样做,它基本上都会被忽略 因此,这意味着您需要子类化NSButton(或您想要使用的任何NSView子类)并覆盖resetCursorRects,以调用整个视图

我正在用XCode开发一个Mac应用程序。我需要添加一个超链接,导航到一个特定的网站。我用一个按钮尝试了这一点,但我需要知道当鼠标位于该按钮上时如何将光标更改为手动光标。

要设置光标,必须使用光标跟踪方法
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子类化。