NSCell 子类化:绘制 NSProgressIndicator?

Posted

技术标签:

【中文标题】NSCell 子类化:绘制 NSProgressIndicator?【英文标题】:NSCell Subclassing: Draw NSProgressIndicator? 【发布时间】:2015-05-11 17:44:02 【问题描述】:

我正在使用基于单元格的 NSTableView。有没有办法创建一个自定义的NSCell 子类并在其中绘制一个 NSProgressIndicator?

类似于:

-(void)drawWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
  [myProgressControl drawOnView:controlView]; //?

NSProgressIndicator 本身仅用作状态指示,并且与用户交互(无需单击鼠标等)。

我想坚持使用基于单元格的 NSTableView,因为我使用的是 NSTableViewDataSource。 NSLevelIndicatorCell 是另一种选择,但我更喜欢 NSProgressIndicator 的外观/设计

【问题讨论】:

看起来工作量很大,但是如果你切换到基于视图的 NSTableView,你会获得更多的控制权。您将不得不更好地实现 NSTableViewDataSource 但这是值得的。这样,您将创建更好的细胞。如果您继续使用单元格视图,您将被限制在几个选项中。 【参考方案1】:

首先,我不确定您所说的“我想坚持使用基于单元格的NSTableView,因为我使用的是NSTableViewDataSource”。基于视图的表格视图和NSTableViewDataSource 之间没有不兼容,尽管有些东西的工作方式略有不同。

无论如何,Apple 有一个示例项目 AnimatedTableView,它显示在基于 NSCell 的表视图中使用进度指示器。这不是通过使用自定义单元类来完成的。相反,进度指示器作为子视图添加到表视图中。在这种东西出现之前,它实际上是基于视图的表格视图的穷人版本。

不用说,我建议您切换到基于视图的表格视图,而不是使用那种复杂的方法。

【讨论】:

使用基于单元的 NSTV 我只需要设置列标识符,这大大简化了事情。使用基于视图的 NSTV 我需要为每列返回一个 NSView。当您以类似数组的方式从 DataSource 请求数据时,DataSource 也将毫无用处。 (DataSource.Items[index]) 如果 NIB 中的单元格视图与表格列具有相同的标识符(并且 Xcode 会自动分配两者以匹配,默认情况下),那么您不需要实现委托方法来返回看法。它是自动找到的。因此,与基于NSCell 的表视图相比,没有缺点。我不知道您所说的数据源无用是什么意思。基于视图的表视图使用它与基于NSCell 的表视图相同。唯一不同的地方可能在于单元格视图如何处理它所传递的objectValue,但它可以非常相似地工作。

以上是关于NSCell 子类化:绘制 NSProgressIndicator?的主要内容,如果未能解决你的问题,请参考以下文章

Layer-Backed NSControl 仍然调用 NSCell 绘图例程

核心数据、NSTableColumn 绑定和自定义 NSCell

在 Win32 中子类化 MonthCal 控件

如果 drawRect: 被覆盖,子类化的 UIView 显示黑色背景

子类化 CAShapeLayer 的正确方法

NSControl 和 NSCell:以正确的方式管理单元状态