2012-03-23 109 views
5

我有一個基於視圖的NSTableView。表中的每個視圖都有一個自定義文本字段。mouseDown:在NSTableView中的自定義NSTextField中

我想在用戶點擊表格視圖內的文本字段(標籤)時觸發一個動作(想象在每個表格單元格中有一個自定義動作的超鏈接)。

我創建了一個基本的NSTextField子類來捕獲鼠標事件。但是,他們只會觸發第二次點擊,而不是第一次點擊。

我嘗試使用NSButton,並立即着火。

這裏的自定義標籤的代碼:

@implementation HyperlinkTextField 

- (void)mouseDown:(NSEvent *)theEvent { 
    NSLog(@"link mouse down"); 
} 

- (void)mouseUp:(NSEvent *)theEvent { 
    NSLog(@"link mouse up"); 
} 

- (BOOL)acceptsFirstResponder { 
    return YES; 
} 

- (BOOL)acceptsFirstMouse:(NSEvent *)theEvent { 
    return YES; 
} 
@end 

回答

6

原來NSTableViewNSOultineView辦理NSTextField情況不同於一個NSButton第一響應狀態。

如果我的自定義文本字段類是獲取標籤以響應第一次單擊按鈕的關鍵,那麼將覆蓋[NSResponder validateProposedFirstResponder:forEvent:]以返回YES

文檔:

http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSResponder_Class/Reference/Reference.html#//apple_ref/occ/instm/NSResponder/validateProposedFirstResponder:forEvent

1

,你所看到的行爲是因爲表視圖是第一響應者,這應該還是當您單擊該行不會改變在標籤上 - 這是用戶在點擊表格行時所期望的行爲。我認爲將表視圖的子類繼承並重寫mouseDown會更好,而不是繼承這個標籤。在調用super的實現mouseDown:之後,你可以做一個命中測試來檢查用戶是否點擊了標籤。

@implementation CustomTable 

- (void)mouseDown:(NSEvent *)theEvent 
{ 
    [super mouseDown:theEvent]; 
    NSPoint point = [self convertPoint:theEvent.locationInWindow fromView:nil]; 
    NSView *theView = [self hitTest:point]; 
    if ([theView isKindOfClass:[NSTextField class]]) 
    { 
     NSLog(@"%@",[(NSTextField *)theView stringValue]); 
    } 
} 

@end 
+0

謝謝,我會嘗試。一個問題:第一次點擊與NSButton一起工作(在這種情況下表格行未被選中)。有什麼辦法模仿這種行爲? – Mark 2012-03-24 08:52:41

+0

可能有,但我不知道。我原以爲acceptFirstMouse和/或accepFirstResponder返回YES是可以做到的。 – rdelmar 2012-03-24 15:49:45

+0

如果您想要使用按鈕獲得的行爲,爲什麼不使用按鈕?您可以關閉邊框,無論如何它看起來都像無邊界標籤。如果你想要一個邊框,你可以在NSBox中嵌入一個無邊界按鈕。 – rdelmar 2012-03-24 16:06:33

7

有同樣的問題。這裏接受的答案不適合我。經過很多努力之後,當我選擇「無」作爲默認的「常規」時,奇蹟般地工作,另一個選項是IB列表視圖的「高亮」選項的「源列表」。

編輯:接受的答案被證明是誤導性的,因爲該方法是重載的表視圖,而不是文本字段的答案建議。它在https://stackoverflow.com/a/13579469/804616更清楚地給出,但無論如何,更具體的感覺有點hacky。

+0

這不起作用。也許你做了別的什麼 – 2015-02-26 16:36:54

+2

它似乎確實有效。我試圖觸發mouseUp,但這不適用於任何方法。 MouseDown與 – 2015-02-26 22:10:37

+0

一起工作雖然這確實起作用,但如果您希望表視圖使用源列表表視圖樣式呢? – 2018-01-18 10:54:04

1

在完全相同的情況下,嵌入NSButtontransparent設置爲true/YES爲我工作。

class LinkButton: NSTextField { 

    var clickableButton:NSButton? 

    override func viewDidMoveToSuperview() {    
     let button = NSButton() 
     self.addSubview(button) 

     //setting constraints to cover the whole textfield area (I'm making use of SnapKit here, you should add the constraints your way or use frames 
     button.snp_makeConstraints { (make) -> Void in 
      make.edges.equalTo(NSEdgeInsetsZero) 
     } 
     button.target = self 
     button.action = Selector("pressed:") 
     button.transparent = true 
    } 

    func pressed(sender:AnyObject) { 
     print("pressed") 
    } 
0

使用window.makeFirstResponser(myTextfield)開始編輯文本字段。你從重寫mouseDown(withEvent TheEvent:NSEvent)方法發送此消息方法

相關問題