在NSTableView调用之前初始化数组

时间:2011-02-11 15:57:04

标签: objective-c xcode macos

我无法填充NStableview。我一直在研究示例,并且已经使用测试阵列获得了一些成功。我唯一的问题是文件经常在运行时崩溃(有时它不会,它是不稳定的)而且我认为我已经将它削减到它有时候没有为数组计数返回任何东西。我猜这是因为在tableview控制器调用时,数组有时没有完全加载。任何想法如何解决这个问题?提前谢谢。

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

2 个答案:

答案 0 :(得分:1)

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

如果您必须使用applicationDidFinishLaunching,则必须先检查testArray!= nil,然后才能在委托方法中访问它。

答案 1 :(得分:1)

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

像这样:

- (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];
}