2011-02-11 39 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

相關問題