2011-02-11 40 views
0

我无法获得NStableview来填充。我一直在通过示例进行研究,并且使用测试数组来提供它已经取得了一些成功。我唯一的问题是该文件经常在运行时崩溃(有时不会,它是脾气暴躁的),我认为我已经削减了它,有时它没有返回数组数。我猜测这是因为数组有时在tableview控制器调用的时候没有完全加载。任何想法如何解决这个问题?提前致谢。在被NSTableView调用之前初始化数组

tableController.h:

#import <Cocoa/Cocoa.h> 
NSArray *testArray; 

@interface tableController : NSObject { 
    IBOutlet NSTableView *jobsTable; 
} 
@end 

tableController.m:

#import "tableController.h" 


@implementation tableController 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    testArray = [NSArray arrayWithObjects:@"foo",@"bar",@"baz",nil]; 
} 


- (int)numberOfRowsInTableView:(NSTableView *)tableView 
{ 
    if ([testArray count] > 0) { 
     return [testArray count]; 
    } else { 
     return 0; 
    } 


} 

- (id)tableView:(NSTableView *)tableView 
objectValueForTableColumn:(NSTableColumn *)tableColumn 
      row:(int)row 
{ 
    if ([testArray count] > 0) { 
     return [testArray objectAtIndex:row]; 
    } else { 
     return 0; 
    } 

} 
@end 

回答

1

我很确定testArray可能是一个实例变量,并且不需要全局变量。 如果你这样做,你可以使用一个自定义的getter来缓存加载数组。

这样的:

- (NSArray *)testArray { 
    if (!testArray) { 
     testArray = [[NSArray alloc] initWithObjects:@"foo",@"bar",@"baz",nil]; 
    } 
    return testArray; 
} 

和您的所有数据源的tableView的方法将使用self.testArray代替testArray

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView { 
    return [self.testArray count]; 
} 
+0

这很好。非常感谢你。 – biscuitstack 2011-02-11 18:14:16

1

尝试使用初始化,而不是在applicationDidFinishLaunching初始化。根据NSApplicationDelegate的文档,applicationDidFinishLaunching在应用程序启动和初始化后被调用,但TableView可能试图在调用该方法之前从两个委托方法中获取条目。

如果您绝对必须使用applicationDidFinishLaunching,则必须在您的委托方法中访问它之前检查testArray!= nil。

+0

我仍然使用这个有坏访问崩溃,但它很好地指出了在init方法给我,这很有用,所以谢谢你。 – biscuitstack 2011-02-11 18:13:37

相关问题