自定义NSCell中的可单击链接

时间:2009-09-09 02:22:44

标签: objective-c cocoa nstableview nscell

我有一个自定义NSCell,其中包含各种元素(图像,各种文本片段),其中一个文本块可能内部有各种可点击链接。我有我的NSAttributedString正确识别链接并将它们着色为蓝色但是我无法弄清楚如何让光标变成一只手并允许用户实际点击它们。

现在我将我的属性字符串绘制到单元格,这显然是不可点击的,但我不确定如何以任何其他方式添加它,因为NSCell不从NSView继承。通常我只是添加一个NSTextField作为子视图,但在这种情况下我不能这样做。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

我能想到的唯一解决方案是通过NSCell中的手动命中测试和鼠标跟踪。最难的部分(我没有答案)是如何确定链接文本的矩形...希望有人可以回答这个问题?

一旦知道url文本的rect,就可以通过实现hitTestForEvent来实现单击操作。我想你会做这样的事情;

// If the event is a mouse down event and the point is inside the rect trigger the url 
- (NSUInteger)hitTestForEvent:(NSEvent *)event inRect:(NSRect)frame ofView:(NSView *)controlView {
   NSPoint point = [controlView convertPoint:[event locationInWindow] fromView:nil];
// Check that the point is over the url region
   if (NSPointInRect(point, urlFrame)) {
       // If event is mousedown activate url
       // Insert code here to activate url
       return NSCellHitTrackableArea;
   } else {
    return [super hitTestForEvent:event inRect:frame ofView:controlView];
   }
}

答案 1 :(得分:2)

根据与Ira Cooke和其他人的谈话,我决定采用以下解决方案:

  • 直接绘制到NSCell
  • 当鼠标进入NSCell时,我会立即向NSTableView添加一个自定义NSView子视图,其位置与悬停在其上的NSCell相同。
  • 他们的设计与像素匹配,因此没有明显的区别
  • 这个NSView将有一个NSTextView(或Field,尚未决定),它将显示带有链接的属性字符串,允许它被点击。
  • 当您将鼠标悬停在NSCell之外时,其镜像NSView将被销毁

如果一切按计划进行,那么我一次只能将1个NSView连接到NSTableView,大部分时间都没有。一旦我开始工作,我会回来报告我的结果。