代码之家  ›  专栏  ›  技术社区  ›  Regexident Amit Attias

使用每行不同的单元格(和数据类型)实现nsoutlineview/nstableview

  •  7
  • Regexident Amit Attias  · 技术社区  · 14 年前

    我想知道如何实现一个大纲视图,比如xcode 3用于构建配置:

    alt text http://img812.imageshack.us/img812/9467/xcodeoutlineview.png

    当使用带有绑定的nsOutlineView/nsTableView和nsTreeController/nsArrayController时, 视图的列获取分配给的绑定 而不是单个细胞,原因很明显。 如果列中的每一行使用相同的单元格,那么它就是一块蛋糕。但是如果 每一行(可能)都使用自己的单元格类型 (而且有了这个绑定的集合,事情就变得很奇怪了)。

    从屏幕截图可以清楚地看到,textfield单元格只需要一个“value”绑定。而弹出按钮单元格至少需要一个用于“ 内容 “一个” 内容价值 “最后但不是至少一个绑定” 选择索引 / 选择对象 / 选择值 “。复选框单元格需要绑定“ 价值 “和(可能)一个” 标题 “。

    如何用尽可能干净(很少)的代码来实现这一点?
    ( 或者正如人们可能会问的那样: 苹果会怎么做呢 ?)

    艾斯

    以下是我到目前为止所做的尝试:
    我通过以下方式提供适当的(复制的)单元格: [大纲视图:DatacellForTableColumn:项:] 并将它们绑定到各个数据模型(从[item representedObject])。 我知道大纲视图中显示的确切数据量(<500行),所以每行有一个单元格不应该是内存问题,不是吗? 我得到了 要正确显示的数据 通过绑定(yay!)但是我不能改变他们的任何价值观。奥欧 显然,值的变化永远无法通过数据模型。除了简单的 [复选框单元格绑定:@“value”to对象:rowmodel withkeypath:@“value”选项:nil] ?(好像这样 足够的 对于 得到 值,但不适用于 设置 相应地。)

    我找不到关于这个话题的任何信息。每列使用自定义单元格的信息和提示很多,但在“每行”的基础上使用自定义单元格却没有。:(
    这对于可可教程来说是很好的东西,不是吗?;)

    1 回复  |  直到 14 年前
        1
  •  3
  •   Joshua Nozzi    14 年前

    未复制列的数据单元格。单元格配置为每行中列的正确值,并在其正确的位置绘制。要挂接的一个好地方是在InstableColumn方法 -dataCellForRow: . 在自定义子类中,可以重写此方法,并为正常操作传递其-datacell或其他单元格类型。

    我有机会在大纲视图中有一个复选框列表示“include”,该列只显示给孩子(非根项目)。无法排除根项目,只排除其子项,因此只显示非根项目的复选框是有意义的。

    我创建了一个自定义的InstableColumn子类,它接受了一个委托(我的数据源控制器),并检查它是否响应了选择器-DeadCellColumn:shouldshowDeadCellForRow:。如果是这样,我调用了这个方法(它在我的数据源控制器上实现),询问它是否应该显示一个“死单元”(一个基本的不绘制任何内容的nscell子类),并根据答案交换它。如果委托没有响应选择器,则表列返回其普通的-datacell。

    这里需要自定义单元格(我称之为“死区”),因为我想确保没有绘制任何内容,也没有可编辑的内容。我不确定这是绝对必要的,但我还是做了。在您的案例中,这并没有多大用处,但为了完整性,我还是想说明一下。

    您的情况有点复杂,尤其是因为涉及到绑定(不同的数据单元类型的值可以有不同的绑定——弹出窗口可能特别具有挑战性)。在我的例子中,我避开了尝试过的真实数据源机制的绑定。它大大简化了事情。:-)对于您的情况,使用数据源方法交换单元格类型非常容易。