2010-06-23 59 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

相关问题