4

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

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

有什么想法吗?

4

2 回答 2

2

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

一旦你知道了 url 文本的矩形,就可以通过实现 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];
   }
}
于 2009-09-09T08:24:41.350 回答
2

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

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

如果一切按计划进行,那么我一次应该只有 1 个 NSView 连接到 NSTableView,而且大多数时候根本没有。一旦我得到它的工作,我会回来报告我的结果。

于 2009-09-10T01:36:09.693 回答