0

我查看了许多问题,但找不到基于视图的 NSOutlineView的好的解决方案

每行着色 NSTableView 文本

更改 NSTableViewCell 的颜色

NSTableCellView 的自定义背景颜色

我正在尝试将每一行设置为我想要的任何颜色。我在某处读过我需要子类化的地方,我NSTableRowView现在已经完成了。

根据AppleDocs,我看到以下方法:

– drawBackgroundInRect:
– drawDraggingDestinationFeedbackInRect:
– drawSelectionInRect:
– drawSeparatorInRect:

我将如何设置各个行的背景颜色?我走错了上面的路线吗?

编辑:下面(也编辑了标题)

由于我使用的是 NSOutlineView 而不是 NSTableView,所以当我更改单元格的背景颜色时,图像如下所示。左侧的披露箭头未着色。有没有办法改变 NSOutlineView 的整行颜色?

这个

4

3 回答 3

1

你可以继承 NSTableViewCell,并添加一个方法来设置它的颜色。

NSTableViewCell 已经是 NSView 的子类,因此在您的子类中,您将添加以下方法:

- (void)setBackgroundColor {
    self.layer.backgroundColor = CGColorCreateGenericRGB(0, 0, 0, 1.0f); // or whatever color
}

或类似的东西。您可能希望将颜色作为该方法的参数。然后,在您的表视图委托中,您可以根据传递给委托方法的行索引设置颜色。例如:

- (UITableViewCell *)tableView:(UITableView *)table cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [table dequeueReusableCellWithIdentifier:@"Cell"];
    if (cell == nil)
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];

    if (indexPath.row % 2) {
        [cell setBackgroundColor:[UIColor redColor]]; // or something like that
    }
}
于 2013-08-08T17:31:07.247 回答
1

想出了一个解决方案。实现了以下。

-(void)outlineView:(NSOutlineView *)outlineView didAddRowView:(NSTableRowView *)rowView forRow:(NSInteger)row {
    [self updateRowViewBackColorforItem:[outlineView itemAtRow:row]];
}

-(void)updateRowViewBackColorforStep:(myCustomItem *)customItem {
    static NSColor *color1;
    static NSColor *color2;
    static NSColor *color3;

    if (color1 == nil) {
        sharedcolorHeader = [NSColor colorWithCalibratedRed:(r/255.0f) green:(g/255.0f) blue:(b/255.0f) alpha:1.0];
    }
    if (color2 == nil) {
        sharedcolorChildren = [NSColor colorWithCalibratedRed:(x/255.0f) green:(y/255.0f) blue:(z/255.0f) alpha:1.0];
    }
    if (color3 == nil) {
        normalColor = [NSColor colorWithCalibratedRed:(255/255.0f) green:(255/255.0f) blue:(255/255.0f) alpha:1.0];
    }

    NSInteger row = [stepOutlineView rowForItem:step];
    if (row < 0) return;

    NSTableRowView *view = [myOutlineView rowViewAtRow:row makeIfNecessary:NO];

   if ([customItem type] == 1) {
        [view setBackgroundColor:sharedcolorHeader];
    } else if([customItem type] == 2) {
        [view setBackgroundColor:sharedcolorChildren];
    } else {
        [view setBackgroundColor:normalColor];
    }
}
于 2013-08-20T19:07:21.207 回答
0

这确实应该依赖于数据模型中的属性或 ivars。如果您使用基于视图的大纲视图,您可以简单地为您的行视图和/或单元格视图提供自定义视图。让自定义视图根据您表示的对象中的数据绘制您想要的任何内容。

于 2013-08-14T03:44:47.783 回答