2010-04-23 106 views
0

我正在做一个“简单的”待办事项列表项目,并在道路上遇到一些颠簸。问题是我的NSTableView没有显示来自NSMutableArray“myArray”的数据,我不知道这是为什么。有人能指出我的错误吗?NSTableView没有显示我的数据。为什么会发生?

/* 
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

Younshould验证的tableView和文本框相连,并查看调试,如果你的numberOfRows和objectValueForTableColumn方法被调用。 – 2010-04-23 01:34:54

回答

4

的问题是,在你的-init方法,您的tableView变量仍然是零。加载一个nib文件时,它首先创建并初始化在nib中声明的所有对象,然后设置它们之间的连接(插口,绑定,操作)。您的任何初始化代码取决于所设置的各种操作,插口或绑定,需要放在-(void)awakeFromNib方法中,而不是-init方法中。您还可以在界面生成器中直接设置表格视图的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 
+0

与问题无关,但init方法错误。 [super init]返回的值需要分配给self,并且需要在分配myArray之前测试以确保self不为零。 – JeremyP 2010-04-23 15:57:20

+0

你说得对。我把它留下了,因为我的编码风格有点搞笑,我担心它可能会让人困惑。我现在编辑它来添加它。 – 2010-04-23 18:09:57

+0

thans所有的帮助。我甚至不知道reloadData方法。我需要阅读更多关于我正在使用的课程。 – lampShade 2010-04-24 00:20:44