我正在制作一个“简单”的待办事项项目,并在路上遇到一些障碍。问题是我的NSTableView没有显示来自NSMutableArray“myArray”的数据,我不知道为什么会这样。有人可以指出我的错误吗?
/*
IBOutlet NSTextField *textField;
IBOutlet NSTabView *tableView;
IBOutlet NSButton *button;
NSMutableArray *myArray;
*/
#import "AppController.h"
@implementation AppController
-(IBAction)addNewItem:(id)sender
{
NSString *myString = [textField stringValue];
NSLog(@"my stirng is %@",myString);
myArray = [[NSMutableArray alloc] initWithCapacity:100];
[myArray addObject:myString];
}
- (int)numberOfRowsInTableView:(NSTableView *)aTableView
{
return [myArray count];
}
- (id)tableView:(NSTableView *)aTableView
objectValueForTableColumn:(NSTableColumn *)aTableColumn
row:(int)rowIndex
{
return [myArray objectAtIndex:rowIndex];
}
-(id)init
{
[super init];
[tableView setDataSource:self];
[tableView setDelegate:self];
NSLog(@"init");
return self;
}
@end
答案 0 :(得分:4)
问题是在你的-init
方法中,你的tableView变量仍然是零。加载nib文件时,它首先创建并初始化nib中声明的所有对象,然后才设置它们之间的连接(出口,绑定,操作)。您的任何初始化代码取决于所设置的各种操作,出口或绑定,需要放在-(void)awakeFromNib
方法而不是-init
方法中。您还可以在Interface Builder中设置表视图的dataSource和委托插座,只需通过控制 - 从tableView拖动到主笔尖窗口中的AppController,然后依次选择每个插座。
此外,每当您更改基础数据时,都需要调用[tableView reloadData]
来获取tableView以反映这些更改。在这种情况下,您需要在-addNewItem:方法中调用它。所以,你的代码应该是这样的:
@implementation AppController
- (id)init
{
if (nil == (self = [super init])) return nil;
myArray = [[NSMutableArray alloc] init];
return self;
}
- (void)dealloc
{
[myArray release];
[super dealloc];
}
- (void)awakeFromNib
{
// assuming you're not just setting up these outlets in IB
[tableView setDataSource:self];
[tableView setDelegate:self];
}
-(IBAction)addNewItem:(id)sender
{
[myArray addObject:[textField stringValue]];
[tableView reloadData];
}
// data source methods same as in your code
@end