2012-05-18 26 views
2

我一個子類的NSOutlineView的細胞,通過在界面生成器設置自定義類調用兩次。hitTestForEvent:inRect:ofView在我NSOutlineView細胞

我實現了這個委託方法來配置單元:

- (void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item 

另外,我實現了這個方法在我的自定義單元格類:

- (NSUInteger)hitTestForEvent:(NSEvent *)event inRect:(NSRect)cellFrame ofView:(NSView *)controlView 

這是每次調用兩次我點擊單元格。我想知道爲什麼不只是一次。事件類型始終是MouseDown。

我不知道這是否重要,但它被調用兩次,即使電池有沒有父母或子女。所以它不能是單元格層次結構。

如果我不能靠hitTestForEvent點擊我的手機的特定區域時觸發一個動作,我應該使用哪種方法?

由於

+0

如果你確定你打這2次,然後每次使用標誌(shouldPerformAction)的則hitTest內和先打執行所需的操作和標誌設置爲false,並在第二主打剛設置的標誌真正。 – alinoz

+0

@alinoz雅,這就是我正在做的,但它有點破解 – aneuryzm

+0

任何新聞,提示,建議? – aneuryzm

回答

2

-hitTestForEvent:inRect:ofView完全錯誤的方法來使用,以觸發動作。您應該使用-trackMouse:inRect:ofView:untilMouseUp:-startTrackingAt:inView:-continueTracking:at:inView:-stopTracking:at:inView:mouseIsUp:

重要提示:如果您實現自己的鼠標跟蹤環路-trackMouse:inRect:ofView:untilMouseUp:你應該記錄這個事實的地方,因爲一般來說它會排除使用其他三種方法。 AppKit框架中的一些NSCell子類會執行此操作,並且無法記錄它們已完成的操作(結果是您將思考幾小時爲什麼-startTrackingAt:inView:永遠不會被調用)。

你如何實現自己的跟蹤循環?就像這樣:

- (BOOL)trackMouse:(NSEvent *)theEvent inRect:(NSRect)cellFrame 
      ofView:(NSView *)controlView untilMouseUp:(BOOL)untilMouseUp 
{ 
    NSPoint pos = [controlView convertPoint:[theEvent locationInWindow] 
           fromView:nil]; 

    if ([theEvent type] == NSLeftMouseDown && NSPointInRect (pos, myClickRect)) { 
    NSWindow *window = [controlView window]; 
    NSEvent *myEvent; 
    NSDate *endDate = [NSDate distantFuture]; 

    while ((myEvent = [window nextEventMatchingMask:(NSLeftMouseDragged 
                |NSLeftMouseUp) 
              untilDate:endDate 
              inMode:NSEventTrackingRunLoopMode 
              dequeue:YES])) { 
     if ([myEvent type] != NSLeftMouseUp) 
     continue; 

     pos = [controlView convertPoint:[theEvent locationInWindow] 
          fromView:nil]; 

     if (NSPointInRect (pos, myClickRect)) { 
     // React somehow 
     } 

     return YES; 
    } 
    } 

    return [super trackMouse:theEvent inRect:cellFrame ofView:controlView 
       untilMouseUp:untilMouseUp]; 
} 

(上面的代碼只是輸入了這裏,所以平時的告誡適用;它假定稱爲myClickRect定義你的電池的有效面積的NSRect的存在,你可能需要計算。從cellFrame在方法的頭部。)

顯然,你可以觀看並處理其他事件來說,如果他們是與你有關的。

也許我還應該補充說三種方法雖然在概念上更清潔,但是往往會比較慢,這通常會導致我更喜歡覆蓋上面顯示的-trackMouse:inRect:ofView:untilMouseUp:

+0

感謝您的長時間答覆。我重寫了 - (BOOL)trackMouse:inRect:ofView:untilMouseUp:但它永遠不會被調用。我沒有使用其他方法,你知道可能是什麼原因嗎? – aneuryzm

+0

也許是因爲超類是NSTextFieldCell? – aneuryzm

+0

- (BOOL)startTrackingAt:inView:,continueTracking:at:inView:和stopTracking:at:inView:mouseIsUp:它們永遠不會被調用 – aneuryzm