【问题标题】:View-based NSTableView view controllers基于视图的 NSTableView 视图控制器
【发布时间】:2012-09-04 12:25:04
【问题描述】:

我不确定我是否做对了,但这是我的问题:

我有一个基于视图的 NSTableView,它使用与数组控制器的绑定。

我需要在每一行上做一些自定义绘图,这取决于表示的对象以及在某些区域捕获点击,所以为此我需要为每一行设置一个控制器并在我的自定义中为子视图设置出口单元格视图,但我不明白如何实现这一点。

如果我只是将一个对象添加到 nib 并与之建立连接,那么我无法判断哪些视图正在被绘制(或已被单击)。

【问题讨论】:

  • 您能否详细说明您想要实现的目标。捕获点击是什么意思?你有按钮还是想处理事件?
  • 我有几个子视图,我想处理 mouseUp 事件。同时,我想根据表示对象的值绘制具有不同颜色的子视图。

标签: cocoa nstableview cocoa-bindings


【解决方案1】:

你必须实现委托方法:

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row

表格视图使用它来获取给定单元格(列、行)的视图。 然后通过使用“makeViewWithIdentifier:owner:”,您可以获得具有给定标识符和给定所有者(视图控制器)的可重用单元格。 最简单的方法是在 Interface Builder 中设计您的单元格,并为每个单元格设置不同的标识符。然后“makeViewWithIdentifier:owner”方法会自动为你创建一个给定标识符的视图。

【讨论】:

  • 这和绑定的使用不冲突吗?
【解决方案2】:

我刚刚发现有人问了一个similar question 并且它的答案也满足了我的需求,所以对于最终来到这里的任何人,这就是我所做的:

  • 我将NSTableCellView 控制器设置为NSTableView 的代理。

  • 在我的NSTableCellView 子类中,我实现了所需的方法(drawRect:、mouseUp: 等)并在控制器中调用相应的方法。

  • 要访问控制器,我得到NSTableView,然后是它的委托,如下所示:

    NSTableView *tableView = (NSTableView*)myView.superview.superview.superview;
    MyControllerClass *controller = (MyControllerClass*)tableView.delegate;
    [controller view:myView drawRect:dirtyRect]
    
  • 在控制器上,为了判断哪个视图正在发送事件,我使用它们的标识符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多