2010-01-30 76 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