我的大纲视图,我正在添加自定义单元格,要绘制自定义单元格,我指的是示例代码,存在于Cocoa文档中
http://www.martinkahr.com/2007/05/04/nscell-image-and-text-sample/
我想用自定义图片更改单元格的显示图像,我尝试过以下内容
- (void)outlineView:(NSOutlineView *)outlineView willDisplayCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item
{
if([item isKindOfClass:[NSValue class]])
{
MyData *pDt = (MyData *)[item pointerValue];
if(pDt->isGroupElement())
{
[cell setImage:pGroupImage];
}
}
}
但是那也没有用,有没有其他办法来改变披露形象, 另外我怎么能在willDisplayCell中找到Item是展开还是折叠,所以我可以相应地设置图像,
这只是改变披露形象的地方吗?
答案 0 :(得分:4)
在我自己研究这个问题并尝试了一些答案之后,我发现所提到的其他方法都有效,但是需要你进行更多的手动干预,以避免屏幕瑕疵和其他奇怪的行为。
我找到的最简单的解决方案如下,在大多数情况下应该可以使用。
该解决方案的另一个好处是系统可以自动处理许多其他情况,例如列移动等,而无需您的参与。
- (void)outlineView:(NSOutlineView *)outlineView willDisplayOutlineCell:(id)cell
forTableColumn:(NSTableColumn *)tableColumn
item:(id)item
{
[cell setImage:[NSImage imageNamed: @"Navigation right 16x16 vWhite_tx"]];
[cell setAlternateImage:[NSImage imageNamed: @"Navigation down 16x16 vWhite_tx"]];
}
在您的情况下,您可以使用类检测逻辑将其包装起来,并根据您的情况适当设置单元格图像。
答案 1 :(得分:1)
你有基本的想法,但你需要做的是自己绘制图像。这是我使用的代码:
- (void)outlineView:(NSOutlineView *)outlineView willDisplayOutlineCell:(id)cell forTableColumn:(NSTableColumn *)tableColumn item:(id)item {
NSString *theImageName;
NSInteger theCellValue = [cell integerValue];
if (theCellValue==1) {
theImageName = @"PMOutlineCellOn";
} else if (theCellValue==0) {
theImageName = @"PMOutlineCellOff";
} else {
theImageName = @"PMOutlineCellMixed";
}
NSImage *theImage = [NSImage imageNamed: theImageName];
NSRect theFrame = [outlineView frameOfOutlineCellAtRow:[outlineView rowForItem: item]];
theFrame.origin.y = theFrame.origin.y +17;
// adjust theFrame here to position your image
[theImage compositeToPoint: theFrame.origin operation:NSCompositeSourceOver];
[cell setImagePosition: NSNoImage];
}
您可能需要3个不同的图片,一个用于ON
状态,一个用于OFF
状态,还有一个用于MIXED
状态,应位于二。混合状态确保您仍然可以获得开始和结束动画。
答案 2 :(得分:1)
更改显示图像的一个好方法是使用基于视图的大纲视图:
在带有NSOutlineViewDelegate的ViewController中:
- (NSView *)outlineView:(NSOutlineView *)outlineView viewForTableColumn:(NSTableColumn *)tableColumn item:(id)item
{
CustomNSTableCellView *cell = [outlineView makeViewWithIdentifier:tableColumn.identifier owner:self];
cell.item = item;
return cell;
}
你必须继承你的NSOutlineView并覆盖方法:
- (id)makeViewWithIdentifier:(NSString *)identifier owner:(id)owner
{
id view = [super makeViewWithIdentifier:identifier owner:owner];
if ([identifier isEqualToString:NSOutlineViewDisclosureButtonKey])
{
// Do your customization
// return disclosure button view
[view setImage:[NSImage imageNamed:@"Disclosure_Categories_Plus"]];
[view setAlternateImage:[NSImage imageNamed:@"Disclosure_Categories_Minus"]];
[view setBordered:NO];
[view setTitle:@""];
return view;
}
return view;
}
//Frame of the disclosure view
- (NSRect)frameOfOutlineCellAtRow:(NSInteger)row
{
NSRect frame = NSMakeRect(4, (row * 22), 19, 19);
return frame;
}
答案 3 :(得分:1)
谁来寻找Swift2解决方案。您的outlineview的子类NSRow并覆盖didAddSubview方法,如下所示。
override func didAddSubview(subview: NSView) {
super.didAddSubview(subview)
if let sv = subview as? NSButton {
sv.image = NSImage(named:"IconNameForCollapsedState")
sv.alternateImage = NSImage(named:"IconNameForExpandedState")
}
}
答案 4 :(得分:0)
这是我迄今为止尝试过的工作,
/ *因为我们正在展示我们自己的披露和扩展按钮* /
- (NSRect)frameOfOutlineCellAtRow:(NSInteger)row {
return NSZeroRect;
}
- (NSRect)frameOfCellAtColumn:(NSInteger)column row:(NSInteger)row {
NSRect superFrame = [super frameOfCellAtColumn:column row:row];
if ((column == 0) && ([self isGroupItem:[self itemAtRow:row]])) {
return NSMakeRect(0, superFrame.origin.y, [self bounds].size.width, superFrame.size.height);
}
return superFrame;
}
我已经将NSOutlineView类子类化并覆盖这些方法,
[self isGroupItem]是检查其组是否成立。 但有一个问题,现在看起来像我需要做的鼠标处理:(,双击组行不切换