我想让一个按钮出现在表视图中作为最后一行的第一个元素而不是普通数据,所以我创建了一个NSTableView的子类并覆盖了preparedCellAtColumn:row:方法来生成所需的行为。最后一行。
- (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:function来解决我的第二个问题,并且根本没有将最后一行索引传递给super函数。
答案 0 :(得分:0)
我很确定你必须使列可编辑才能激活其中的UI元素。
顺便说一句,在表格末尾放置某种控制通常是个坏主意,尤其是影响整个表格的控制。表应由逻辑重复单元组成。在表中放置一些独特的东西会导致用户混淆并隐藏功能。您最有可能想要在表格外移动按钮。