NSTableView没有显示我的数据。为什么会这样?

时间:2010-04-23 00:58:53

标签: objective-c cocoa

我正在制作一个“简单”的待办事项项目,并在路上遇到一些障碍。问题是我的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

1 个答案:

答案 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