2013-03-18 76 views
2

我試圖通過嘗試轉換我使用C編寫的程序來學習Objective C。該程序適用於大2加維數組並對它們進行計算,所以我需要能夠在UI上以表格格式顯示二維數組。最好的辦法是將我的C風格數組逐行轉換爲NSMutableArrays,然後將另一個NSMutableArray中的「row」NSMutableArray作爲「堆棧」存儲到NSTableView中。 (如果有更好的方法,請告訴我。)在NSTableView中顯示2D陣列

我遇到的問題是我似乎無法讓它們存儲在arrayOfArrays中。它只是空。我確信我正在做一個愚蠢的noob錯誤,我認爲它與我調用構造函數的方式有關,但我無法弄清楚。

這裏是我的代碼:

int grid[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; 

NSMutableArray *arrayOfArrays; 


int x=0; 

-(void)awakeFromNib 
{ 
    NSMutableArray *array1 = [[NSMutableArray alloc]init]; 
    NSMutableArray *array2 = [[NSMutableArray alloc]init]; 
    NSMutableArray *array3 = [[NSMutableArray alloc]init]; 


    for (int y=0; y < 3; y++) { 
     [array1 addObject:[NSNumber numberWithInt:grid[x][y]]]; 
    } 

    x++; 
    for (int y=0; y < 3; y++) { 
     [array2 addObject:[NSNumber numberWithInt:grid[x][y]]]; 
    } 

    x++; 
    for (int y=0; y < 3; y++) { 
     [array3 addObject:[NSNumber numberWithInt:grid[x][y]]]; 
    } 

    [arrayOfArrays addObject:array1]; 
    [arrayOfArrays addObject:array2]; 
    [arrayOfArrays addObject:array3]; 

} 

- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView 
{ 
    return [arrayOfArrays count]; 
} 

- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn  *)aTableColumn row:(NSInteger)rowIndex 
{ 
    return [arrayOfArrays objectAtIndex:rowIndex]; 
} 

@end 

哦,這個對象是一個NSTableViewSource,它是對NSTableView的數據源。

回答

0

我假設arrayOfArrays是一個實例變量?如果是這樣,那麼是的,你看到的問題是因爲在你嘗試向它添加項目之前你還沒有初始化(創建)arrayOfArrays

雖然你可以做到這一點在awakeFromNib,我通常做在init,如果你不使用ARC,以平衡initarrayOfArrays創建一個releasedealloc

- (id)init { 
    if ((self = [super init])) { 
     arrayOfArrays = [[NSMutableArray alloc] init]; 
    } 
    return self; 
} 

- (void)dealloc { 
    [arrayOfArrays release]; 
    [super dealloc]; 
} 

當你在Objective-C中初始化(init*)對象時,實例變量自動設置爲0(對於基元類型)和nil(對於Objective-C對象)。在你的原始代碼中,[arrayOfArrays addObject:array1];這幾行基本上等於[nil addObject:array1];,換句話說,發送消息到nil。這在Objective-C中是允許的,結果是消息被簡單地忽略。 numberOfRowsInTableView:方法將「解決」到return [nil count];這將返回0,所以你的應用程序不會打擾調用tableView:objectValueForTableColumn:row:方法(即使被調用,它也會返回nil)。

+0

謝謝!這回答我的原始問題。 – 2013-03-20 17:24:46

0

您最初的數組是:

int grid[3][3] = {{1,2,3},{4,5,6},{7,8,9}}; 

你可以做一維數組:

NSMutableArray *arrayOfArrays=[NSMutableArray new]; 
for(int i=0;i<3;i++){ 
    for(int j=0;j<3;j++){ 
     [arrayOfArrays addObject:grid[i][j]]; 
    } 
} 

現在你可以使用arrayOfArrays作爲數據源。

編輯:

將這種表現的將是罰款嗎?

enter image description here

+0

我認爲這不適合我。據我瞭解NSTableView,繪製一維數組會給我九行一個,我需要三行三行。 (除非格式化NSTableView有不同的方式。) 而且我仍然無法獲得* arrayOfArrays來接受任何數據。 – 2013-03-19 14:12:05

+0

我剛剛重讀我原來的帖子,我的意思是說我的問題是我無法獲得任何存儲在* arrayOfArrays中的東西。我留下了一個「'噸」。 – 2013-03-19 14:16:04

+0

檢查我的編輯,這裏我有2D數組,A包含2Kids,蘋果,飛機,第二個包含2kids,ball,.baloon。 – 2013-03-19 14:16:41

0

你不你的C數組轉換爲對象。這可能是一項巨大的不必要的努力,除非你只是想做。 Objective-C的一個教訓是C仍然存在,並且仍然適用。一切都沒有必須是一個對象。 :D

您可以使用Table View Datasource方法來完成這項工作。

tableView:objectValueForTableColumn:row:numberOfRowsInTableView:

在你numberOfRowsInTableView:實現,只是返回要使用的行數組維元素的個數。

在您的tableView:objectValueForTableColumn:row:實現中,您可以將數組元素值作爲NSNumber對象或NSString對象進行裝箱,然後返回該對象。 (NSNumber文字在這裏會非常方便)

唯一笨拙的部分,您可能仍然想要以編程方式根據數組元素的維數來構建出表中的列數。添加表格列或根據需要刪除它們。 這將提供一個很好的練習,在代碼中構建表視圖。它會幫助你理解一些表格視圖。那麼,在創建C數組時,您仍然需要知道C數組的大小,以避免走到最後...(C陷阱...)

+0

謝謝!你給了我一個更好的方式來完成我原來的工作。 – 2013-03-20 17:25:19