2009-09-09 49 views
4

我有一個自定義的NSCell,裏面有各種元素(圖像,各種文本塊),其中一個文本塊可能有各種可點擊的鏈接。我有我的NSAttributedString正確識別鏈接並將它們着色爲藍色,但我無法弄清楚如何讓光標變成手,並允許用戶實際點擊它們。自定義NSCell中的可點擊鏈接

現在我已將我的屬性字符串繪製到顯然不可單擊的單元格中,但我不確定如何以任何其他方式添加它,因爲NSCell不會從NSView繼承。通常我只是添加一個NSTextField作爲子視圖,但在這種情況下我不能這樣做。

有什麼想法?

回答

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]; 
    } 
} 
2

基於我決定去以下解決方案與艾拉·庫克和其他人談話:

  • 直接繪製到的NSCell
  • 當鼠標進入的NSCell,我會立即添加一個自定義NSView子視圖到NSTableView的位置與懸停的NSCell位置相同。
  • 他們的設計的像素匹配的像素,所以沒有明顯的差異
  • 這一個NSView將有一個NSTextView(或現場,還沒有決定),將顯示屬性串在它的鏈接允許它可以點擊。
  • 當你將鼠標懸停出的NSCell其鏡的NSView被破壞

如果一切按計劃進行,那麼我應該只在一個時間附着在NSTableView的1周的NSView和大部分時間都不在一切順利。我會回來報告我的結果,一旦我得到它的工作。

+2

這是100%實施,並像一個魅力。關鍵是將NSTrackingArea添加到scrollview的可見部分,然後在NSTableView上轉換鼠標點並調用rowAtPoint:。然後,獲取返回行的矩形並將您的NSView放在那裏。完善。 – 2009-09-28 02:52:12

+0

嗨邁克,你介意分享你寫的代碼來實現這個嗎? – user6325 2009-10-01 10:32:35

+0

是的,請分享代碼.. – triandicAnt 2013-07-29 13:21:22