2012-09-04 53 views
5

,當我面臨着在10.8上運行的基於視圖的NSTableView的一個問題(目標是10.7,但我認爲這是不相關的)來觸發在視圖中NSTableCellView基於NSTableView的一個動作。如何使用綁定

我使用一個NSTableView,我也得到含量值,我的自定義NSTableCellView通過綁定。我使用NSTableCellView的obejctValue來獲取我的數據。

我添加了一個按鈕,我的手機,我想它引發一些行動點擊時。到目前爲止,我只能夠觸發定製NSTableCellView的子類中的一個動作。

我能得到被點擊像這樣的,使用鏈條行:

NSButton *myButton = (NSButton*)sender;  

NSTableView *myView = (NSTableView*)myButton.superview.superview.superview; 

NSInteger rowClicked = [myView rowForView:myButton.superview]; 

從那裏,我不知道如何到達我的應用程序代理或控制器其中定義的動作。

由於我使用可可綁定,我沒有對NSTableView的,我可以用它來觸發我的行動代表。

你有什麼想法,我怎麼能談回控制器?

非常感謝提前!

回答

2

雖然使用的是綁定你還可以設置你的控制器作爲代表在界面生成器的實現代碼如下。

我看到你已經能夠從細胞內訪問表視圖。下一個任務必須簡單,只需將表視圖委託設置爲按鈕操作的目標即可。

+0

謝謝,發現你說的方式。實際上最初是因爲必須提供電池而感到困惑。但它工作正常。 –

3

謝謝你的問題,我也將觸發從一個NSTableView的一個按鈕的操作。你的問題有助於我走上正確的道路。

首先解決您的解決方案,以發現其行號我NSTableView的是。我能找到它不知道該按鈕,在我的自定義NSTableView的我安裝了以下內容作爲第一次嘗試:

- (NSInteger)myRowNumber 
{ 
    return [(NSTableView*)self.superview.superview rowForView:self]; 
} 

這工作得很好,但它是小於強勁。它只在你已經知道你在視圖層次結構中有多深時纔有效。更健壯和通用的解決方案是:

- (NSInteger)myRowNumber 
{ 
    NSTableView* tableView = nil; 
    NSView* mySuperview = self; 

    do 
    { 
     NSView* nextSuper = mySuperview.superview; 
     if (nextSuper == nil) 
     { 
      NSException *exception = 
       [NSException exceptionWithName:@"NSTableView not found." 
        reason:[NSString stringWithFormat:@"%@ search went too deep.", 
        NSStringFromSelector(_cmd)] userInfo:nil]; 
      @throw exception; 
     } 

     if ([nextSuper isKindOfClass:[NSTableView class]]) 
      tableView = (NSTableView*)nextSuper; 
     else 
      mySuperview = mySuperview.superview; 
    } while (tableView == nil); 

    return [tableView rowForView:self]; 
} 

這不僅工作在NSTableView的水平,但與安裝在它上面的任何級別的任何工作,無論多麼複雜的視圖層次。

至於你的問題的解答部分,我在班級建立一個IBOutlet和使用Interface Builder如果連接到我的文件所有者(在我的情況,我的文檔類)。我曾有過一個參考,我送我的消息對類和行數,我調用該函數。在我的情況下,這個調用要求我傳遞它起源的行號。

[self.myDoc doSomethingToRow:self.myRowNumber]; 

我測試了它,它在NSTableView上方的視圖層次結構的各個層次上都有效。它的功能不需要先選中該行(這似乎是在Apples文檔中假定的)。

的問候,喬治·勞倫斯風暴,莫爾特比,華盛頓,美國

1

使用rowForView:和響應鏈

要嵌入的NSTableCellView內的控制的行動作出反應,控制應該發出動作到第一回復者。或者,檔案負責人是可能的,但這是更緊密耦合。

使用rowForView:操作方法中,以確定哪些行的控制發出的動作:

- (IBAction)revealInFinder:(id)sender { 
    NSInteger row = [self.tableView rowForView:sender]; 
    ... 
} 

的行動中的任何響應鏈類實現。最有可能的是,這將是您的子類NSWindowController實例。響應者也可以是應用程序代表;假設代表有辦法與NSTableView交談。

請參閱Apple的示例TableViewPlayground: Using View-Based NSTableView and NSOutlineView以查看此操作。