2010-01-30 46 views
1

這裏是我的代碼:NSTableView的不顯示數據

test.h

@interface testAppDelegate : NSObject <NSApplicationDelegate> { 
    NSWindow *window; 
    IBOutlet NSTableView *test; 
    NSMutableArray *internalArray; 
} 

@property (assign) IBOutlet NSWindow *window; 
@property (nonatomic, retain) NSTableView *test; 
-(id) initWithArray: (NSArray*) objects; 
-(int)numberOfRowsInTableView:(NSTableView *)aTableView; 
-(id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn  *)aTableColumn row:(int)rowIndex; 
-(void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex; 

test.m(頂部件漏掉爲了簡單起見)

@synthesize window; 
@synthesize test; 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    PSClient *client = [PSClient applicationClient]; 
    NSURL *url = [NSURL URLWithString:@"http://www.apple.com/main/rss/hotnews/hotnews.rss"]; 
    PSFeed *feed = [client addFeedWithURL:url]; 
    internalArray = [NSMutableArray array]; 

    // Retrieve the entries as an unsorted enumerator 
    NSEnumerator *entries = [feed entryEnumeratorSortedBy: nil]; 
    PSEntry *entry; 
    // Go through each entry and print out the title, authors, and content 
    while (entry = [entries nextObject]) { 
     [internalArray addObject:entry.title]; 
     //NSLog(@"Entry Title:%@", entry.title); 
     //NSLog(@"Entry Authors:%@", entry.authorsForDisplay); 
     [test reloadData]; 
     //NSLog(@"Entry Content:%@", entry.content.plainTextString); 
    } 
} 

-(int)numberOfRowsInTableView:(NSTableView *)aTableView{ 
    NSLog(@"%@", [internalArray count]); 
    return [internalArray count]; 
} 

-(id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex 
{ 
    NSString *string = [internalArray objectAtIndex:rowIndex]; 
    NSLog(@"%@", string); 
    // when I debug, I get same pointers with invalid data 
    // each object has "name" message 
    // this following line gives invalid pointer and 
    // it crashes 
    return string; 
} 

-(void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex 
{ 
    NSString *string = [internalArray objectAtIndex:rowIndex]; 
    NSLog(@"%@", string); 
    // when I debug, I get same pointers with invalid data 
    // each object has "name" message 
    // this following line gives invalid pointer and 
    // it crashes 
    return string; 
} 
@end 

在IB我有實現代碼如下(測試)掛鉤到應用程序委託:測試,數據源和委託

由於某種原因,表不顯示數據,以及我何時調用[test reloadData];該應用程序崩潰

回答

1

第一個帶子彈 - 創建後不保留internalArray。使用的一個:

internalArray = [[NSMutableArray] alloc] init]; 
internalArray = [[NSMutableArray array] retain]; 

什麼,而不是你目前有:

internalArray = [NSMutableArray array]; 

另外,我覺得你可能不希望%@對該方法的格式爲:

-(int)numberOfRowsInTableView:(NSTableView *)aTableView{ 
    NSLog(@"%@", [internalArray count]); 
    return [internalArray count]; 
} 

當你做[tableView reloadData]時,該代碼肯定會(通常)導致崩潰。

applicationDidFinishLaunching:中,每次將對象添加到internalArray時,都不需要撥打reloadData。只需在該循環結束時執行一次。

您的setObjectValue:forTableColumn:row:的實施也沒有意義。它應該看起來更像這樣:

-(void)tableView:(NSTableView *)aTableView setObjectValue:(id)anObject forTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex 
{ 
    NSLog(@"%@", anObject); 
    [internalArray replaceObjectAtIndex:rowIndex withObject:anObject]; 
} 

希望這些是一些想法讓你開始。

+0

是的,NSLog是我放在那裏爲了把它放在那裏。 並且謝謝!它現在有效! – 2010-01-30 22:05:04