我目前通过控制器(MVC设计模式)填充NSTableView,我在控制器的init
方法中初始化NSMutableArray的一个条目。
我将如何:
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
答案 0 :(得分:3)
我将如何:
- 填充我的NSMutableArray,这是一个Person对象数组
第1步:创建Person对象。
您注释掉的代码就是这样做的,尽管您可能需要单独创建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时发出抗议。