问题是NSTableView在发送-editColumn:row:withEvent:select:时绘制了白色背景。它用 +[NSColor textBackgroundColor] 填充单元格的矩形。
如果有一个公共 API 用于覆盖开发人员颜色空间中命名颜色的当前设置,我们可以将其设置在 -editColumn:row:withEvent:select: 等的覆盖内。我不记得这样的 API(指针表示赞赏)。另外:我只在 Snow Leopard 上测试过这段代码(甚至是下面的 Leopard SDK 附录)。针对您打算支持的实际 SDK 和运行时环境验证代码。
NSTableView 有一个用于填充颜色的私有访问器,但它是一个只读属性。没有设置器,所以我们不能只更改标准 NSTableView 上的值。我们必须对它进行子类化。(由于您希望在 outlineView 中具有相同的行为,并且 NSOutlineView 已经是 NSTableView 的子类,我们将继承 NSOutlineView。但是,除了超类之外,代码是相同的。)
@interface ASCOutlineView : NSOutlineView {
}
@end
@implementation ASCOutlineView
- _textBackgroundColor
{
return ([NSColor clearColor]);
}
@end
在 Snow Leopard 中编辑表格单元格时,似乎只需要防止那个刺眼的白色块破坏您的 HUD。
不过,针对 Leopard SDK 编译的应用程序需要更多支持。Leopard 的 tableViews 可能已经硬编码了一些渲染属性,所以我们需要重写一个选择方法。
NSTextFieldCells 实际上是 NSTextViews 的包装器,因此它们可以在控件中使用。它们通常共享相同的 textView 实例,该实例由窗口(或其子类,在本例中为面板)管理。NSTableView 更改 NSTextFieldCell 的设置以符合用于编辑数据的系统 UI 设置。大多。然后 NSTextFieldCell 将这些设置传播到 NSTextView。在这条管道上的任何时候,我们都可以重写一两个方法来更改这些属性的值以匹配我们自己的 UI。
我使用 -[NSTextFieldCell setDrawsBackground:] 因为它需要很少的努力才能正确。保持内部状态与我们希望达到的效果一致也很重要,以防其他对象可能依赖于该状态。
@interface ASCTextFieldCell : NSTextFieldCell {
}
@end
@implementation ASCTextFieldCell
- (void)setDrawsBackground: (BOOL)flag
{
[super setDrawsBackground: NO];
}
@end
在编辑单元格时防止对焦环出现是一个简单的问题,只需更改其对焦环类型的设置即可。令人沮丧的是,IB 不提供对该属性的访问,因此必须以编程方式完成:
for(eachColumn in [hudOutlineView tableColumns])
{
columnCell = [[ASCTextFieldCell alloc] initTextCell: @""];
[eachColumn setDataCell: columnCell];
if([columnCell respondsToSelector: @selector(setFocusRingType:)] != NO)
[(NSTextFieldCell *)columnCell setFocusRingType: NSFocusRingTypeNone];
}