【问题标题】:Populating NSTableview from a mutable array从可变数组填充 NSTableview
【发布时间】:2010-08-03 15:15:12
【问题描述】:

我已经尝试了两天,并且不断陷入死胡同。

我已经完成了 Aaron Hillegass 的 Cocoa Programming for MAC OS X,并完成了所有与 NSTableview 和可变数组相关的练习,并且我一直在尝试修改它们以满足我的需要。

但是他们似乎都没有使用带有对象的数组作为数据源,它似乎使用 tableview 作为数据源。

我正在尝试实现 Jonas Jongejan 对我的代码 here 的“reworking”,并使用 Cocoa 前端来显示结果。

我知道的任何指示或建议都应该很简单,但我在这里迷失了方向。

我可以通过设置数组来填充表格

【问题讨论】:

    标签: objective-c cocoa nstableview


    【解决方案1】:

    这真的很简单,一旦你理解了它(当然!)。您不能将 NSArray 直接用作表源。您需要创建一个实现NSTableViewDataSource 的自定义对象,或者在某个现有类(通常是控制器)中实现该协议。如果您使用 Xcode 创建一个基于标准文档的应用程序,那么文档控制器类 -(它将被称为 MyDocument)是一个很好的使用类。

    你至少需要实现这两种方法:

    – numberOfRowsInTableView:
    – tableView:objectValueForTableColumn:row:
    

    如果您有一个可变数组,您希望在具有一列的表格视图中使用其值,则应首先执行以下操作:

    – numberOfRowsInTableView: (NSTableView*) aTableView
    {
        return [myMutableArray count];
    }
    
    – tableView: (NSTableView*) aTableView objectValueForTableColumn: (NSTableColumn *)aTableColum row: (NSInteger)rowIndex
    {
        return [myMutableArray objectAtIndex: rowIndex];
    }
    

    我刚刚想到,您可以将上述两种方法作为一个类别添加到 NSArray 中,将 myMutableArray 替换为 self,然后您可以使用数组作为数据源。


    无论如何,对于可变数组,重要的是,任何时候更改它,都需要让 table view 知道它已被更改,因此需要发送 table view -reloadData


    如果您的表格视图有多个列,并且您想用数组中对象的属性填充它,那么您可以采取一个技巧来让自己更轻松。假设您的数组中的对象是一个名为 Person 的类的实例,其中定义了两个方法:

    -(NSString*) givenName;
    -(NSString*) familyName;
    

    如果您希望表格视图中的每一个都有一个列,您可以将每列的 identifier 属性设置为该列显示的 Person 中的属性名称,并使用如下内容:

    – tableView: (NSTableView*) aTableView objectValueForTableColumn: (NSTableColumn *)aTableColum row: (NSInteger)rowIndex
    {
        Person* item = [myMutableArray objectAtIndex: rowIndex];
        return [item valueForKey: [tableColumn identifier]];
    }
    

    如果将valueForKey: 替换为valueForKeyPath: 并且您的Person 类也有以下方法:

    -(Person*) mother;
    -(Person*) father;
    -(NSString*) fullName;  // concatenation of given name and family name
    

    您可以添加具有以下标识符的表列:father.fullNamemother.familyName,这些值将被自动填充。

    【讨论】:

      【解决方案2】:

      您可以走数据源路线并自己完成所有繁重的工作,或者您可以让绑定为您完成所有繁重的工作。将NSArrayController 添加到包含表格视图的 nib 文件中。确保 nib 的 File's Owner 设置为包含可变数组的同一类。将阵列控制器的contentArray绑定到File's Owner.myMutableArray。对于每一列,将Value 绑定到阵列控制器arrangedObjects 并添加适当的键路径。如果您需要,这将允许您免费获得诸如用户排序之类的东西。

      【讨论】:

        【解决方案3】:

        在 iPhone 上(我知道您说的是 Mac,但也许这会有所帮助)您必须使用委托来加载 tableView。它要求一个单元格,然后您使用数组在需要的地方填写数据。 我不确定这是否适用于 Mac,但值得研究。

        也许将 dataSource 设置为 self 并使用这些委托方法根据行和列访问您的数组#

        【讨论】:

        • @willcodejavaforfood 的答案适用于 iPhone,但您可以点击该链接了解我的意思
        【解决方案4】:

        Apple 有完整的 Table View Programming 指南,因此我建议您从该指南的 Using a Table Data Source 部分开始。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-05-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-03
          相关资源
          最近更新 更多