2010-06-23 34 views
0

我希望在表視圖中有一個按鈕作爲最後一行的第一個元素而不是普通數據,所以我創建了NSTableView的子類並覆蓋了preparedCellAtColumn:row :在最後一行生成所需行爲的方法。以編程方式創建的NSButtonCell在點擊時不會突出顯示

- (NSCell *)preparedCellAtColumn:(NSInteger)column row:(NSInteger)row { 
    if(row < [self numberOfRows]-1) { 
     return [super preparedCellAtColumn:column row:row]; 
    } else { 
     // if we're on the last row, we're going to add the button instead of data 
     if(column == 0) { 
      NSButtonCell *button = [[NSButtonCell alloc] initTextCell:self.buttonTitle]; 
      [button setEditable:YES]; 
      [button setSelectable:YES]; 
      [button setBezelStyle:NSTexturedSquareBezelStyle]; 
      [button setGradientType:NSGradientConvexWeak]; 
      [button setButtonType:NSMomentaryPushInButton]; 
      [button setHighlightsBy:NSBackgroundStyleLowered]; 
      [button setAction:@selector(openAddDialog)]; 
      [button setControlView:self]; 
      return button; 
     } else { 
      NSTextFieldCell *emptyCell = [[NSTextFieldCell alloc] initTextCell:@""]; 
      [emptyCell setEditable:NO]; 
      [emptyCell setSelectable:NO]; 
      return emptyCell; 
     } 
    } 
} 

幸運的是,該功能可以運行 - 出現在最後一排的按鈕,點擊它時,它調用openAddDialog選擇。但是,有兩個視覺問題:
1.按鈕點擊時不突出顯示(按下)。
2.當點擊表格時,表格選擇帶有按鈕的行。
我對Objective C和Cocoa還很新,所以我不確定在哪裏尋找這些解決方案。爲什麼按鈕的setHighlighted方法在點擊時被調用? 在NSTableView選擇一行之前調用了什麼方法,以便我可以覆蓋它並告訴它不要選擇最後一行?

我最終解決了我的第二個問題,通過重寫selectRowIndexes:byExtendingSelection:函數在我的表子類中,並且沒有將最後一行索引傳遞給超級函數。

回答

0

我敢肯定,你必須讓列可編輯才能激活其中的UI元素。

順便說一句,在表格末尾放置某種控件通常是一個壞主意,尤其是影響整個表格的控件。表格應該由邏輯重複單位組成。在桌子上放一些獨特的東西會導致用戶混淆,並可能隱藏功能。你很可能想把按鈕移動到桌子外面。

+0

即使我將按鈕設置爲可編輯(並且可選擇,對於這一點),它仍然不點亮時點擊。什麼引起我的是,行動正常 - 所以按鈕正在接受點擊,對不對?如果它捕捉到點擊事件,爲什麼它不會突出顯示? 只要控制表中的東西,它基本上是一個「添加新行」按鈕,並且我沒有在接口的其餘部分有很多空間,所以它看起來像一個邏輯放置它的地方。我的老闆喜歡它,所以我現在不願意改變它。 :P – 2010-06-23 16:53:00

+0

對不起,我沒有注意到按鈕的工作原理。我不確定問題是什麼。 – TechZen 2010-06-23 18:46:19

相關問題