如何填充NSTableView?

时间:2012-02-02 07:02:40

标签: objective-c macos cocoa nstableview

我目前通过控制器(MVC设计模式)填充NSTableView,我在控制器的init方法中初始化NSMutableArray的一个条目。

我将如何:

  1. 填充我的NSMutableArray,这是一个Person对象数组
  2. 我应该在我的基类的mainViewDidLoad方法中填充NSMutableArray吗?我没有找到任何示例或资源。
  3. 型号(Person.m)

    #import "Person.h"
    
    
    @implementation Person
    
    @synthesize name;
    @synthesize gender;
    
    - (id)init
    {
        self = [super init];
        if (self) {
            name = @"Bob";
            gender = @"Unknown";
        }
    
        return self;
    }
    
    - (void)dealloc
    {
        self.name = nil;
        self.gender = nil;
    
        [super dealloc];
    }
    
    @end
    

    控制器(PersonController.m)

    #import "PersonController.h"
    #import "Person.h"
    
    
    @implementation PersonController
    
    - (id)init
    {
        self = [super init];
        if (self) {
            PersonList = [[NSMutableArray alloc] init];
    //        [personList addObject:[[Person alloc] init]];
    //        
    //        [personTable reloadData];
        }
    
        return self;
    }
    
    - (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView {
        return [personList count];
    }
    
    - (id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
        Person *person = [personList objectAtIndex:row];
        NSString *identifier = [tableColumn identifier];
    
        return [person valueForKey:identifier];
    }
    
    - (void)dealloc
    {
        [super dealloc];
    }
    
    @end
    

    基础文件(Main.h):

    #import "Main.h"
    
    @implementation Main
    
    - (void)mainViewDidLoad
    {
    
    }
    
    @end
    

3 个答案:

答案 0 :(得分:3)

  

我将如何:

     
      
  • 填充我的NSMutableArray,这是一个Person对象数组
  •   

第1步:创建Person对象。

第2步:Add them to the array.

您注释掉的代码就是这样做的,尽管您可能需要单独创建Person,以防您想要配置它(例如,设置其名称)。

  

我应该在我的基类的mainViewDidLoad方法中填充NSMutableArray吗?

用户在看到你的模型创建它之前会有多长时间并不重要,但从概念上讲,它对我来说有点气味。它与视图没有任何关系,所以我说它属于init

当然,如果主视图及其中的每个视图都已加载,您需要tell the table view to reload your data才能显示您对该数组所做的任何更改。相反,如果您在加载视图之前创建模型,则最初不需要重新加载,因为表视图已经向您询问过一次模型。

答案 1 :(得分:1)

Offhand,PersonController中注释掉的代码看起来正确。我假设NSTableRow具有正确的标识符。唯一的问题是您的person对象是空白的,因此没有要显示的字符串。我打赌发生的事情是你的行试图在第一行显示nil,而是显示空字符串。是否创建人物对象,设置名称和性别字段,然后将其放入NSMutableArray并调用reloadData工作(基本上,您的注释代码的作用,除非您现在提供一些实际数据显示)?

答案 2 :(得分:0)

好吧,我假设你的控制器有一个IBOutlet NSTableView * personTable属性,它绑定在界面构建器中?

此外,在控制器的接口中应声明协议,但同样,由于控制器的实现具有适当的方法,我假设你也正确设置了这个。

另一个细节是,在接口构建器中是否正确设置了表列的标识符?从这个例子中,我不清楚列标识符如何与Person的属性(名称和性别)相关。数组personList是否应该保存字典对象,字典的对象是person,字典的键是否映射到您在界面构建器中设置的列标识符?

另一个技术性,属性的名称(PersonList)不应该以大写字母开头。我认为只是一个错字,编译器至少应该在你尝试使用小写p获取personList时发出抗议。