2010-04-23 88 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