如何填充 NSTableView?

4

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

我应该如何:

  1. 填充我的 NSMutableArray,它是 Person 对象的数组
  2. 我应该在我的基类的 mainViewDidLoad 方法中填充 NSMutableArray 吗? 我没有找到任何关于这方面的示例或资源。

模型 (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个回答

3

我该如何:

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

步骤1:创建Person对象。

步骤2:将它们添加到数组中。

您注释掉的代码确实做到了这一点,但您应该单独创建Person对象,以防您想要配置它(例如,设置其名称)。

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

无论您在用户看到模型之前多久创建它都无关紧要,但从概念上讲,它对我来说有点不利。它与视图无关系,因此我认为它属于init

当然,如果主视图 - 以及其中的每个视图 - 已经加载,您需要告诉表格视图重新加载数据,以便显示您对数组所做的任何更改。相反,如果您在加载视图之前创建了模型,则最初不需要重新加载,因为表格视图已经要求您提供模型。


1

一开始看你在PersonController里注释掉的代码是对的。我假设NSTableRow有正确的标识符。唯一的问题是你的person对象是空的,所以没有字符串可以显示。我猜发生的情况是你的行试图在第一行显示nil,并显示为空字符串。创建你的person对象,设置姓名和性别字段,然后将其放入NSMutableArray并调用reloadData是否有效(基本上,就是你注释掉的代码,除了现在你提供了一些实际数据来显示)?


抱歉,我应该包含我的初始化代码。请查看更新,因为我用Person.m替换了Person.h以获得更清晰的代码。 - Coderama

0

好的,我假设您的控制器具有IBOutlet NSTableView *personTable属性,并在界面构建器中进行了绑定?

此外,在控制器的接口中应声明协议,但由于控制器的实现具有适当的方法,因此我认为您已经正确设置了这一点。

另一个细节是,表格列的标识符是否已在界面构建器中正确设置?从这个例子中,我不清楚列标识符与Person的属性(名称和性别)之间的关系。personList数组不应该保存字典对象吗,其中字典对象是人员,字典的键映射到您在界面构建器中设置的列标识符?

还有一个技术细节,属性的名称(PersonList)不应以大写字母开头。我认为这只是一个笔误,编译器应该在您尝试使用小写p获取personList时发出警告。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接