2

C で作成したプログラムを変換して、Objective C を学習しようとしています。このプログラムは、2 次元以上の大きな配列で動作し、それらに対して計算を行うため、2D 配列を表形式で表示できる必要があります。 UIで。これを行うための最善の方法は、C スタイルの配列を行ごとに NSMutableArray に変換し、「行」の NSMutableArray を別の NSMutableArray に「行のスタック」として格納して NSTableView に渡すことです。(もっといい方法があれば教えてください。)

私が抱えている問題は、それらをarrayOfArraysに格納できないように見えることです。それはただのヌルです。私は愚かな初心者のエラーを犯していると確信しており、コンストラクターの呼び出し方法に関係があると思いますが、理解できません。

これが私のコードです:

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 の dataSource です。

4

3 に答える 3

0

C 配列をオブジェクト変換する必要はありません。やりたいだけでない限り、それは非常に不必要な努力になる可能性があります。Objective-C の教訓の 1 つは、C がまだ存在し、使用され、適切であるということです。すべてがオブジェクトである必要はありません。:D

テーブル ビュー データソース メソッドを使用して作業を行うことができます。

tableView:objectValueForTableColumn:row:numberOfRowsInTableView:

実装では、numberOfRowsInTableView:行に使用する配列次元の要素数を返すだけです。

実装では、 tableView:objectValueForTableColumn:row:配列要素の値を NSNumber オブジェクトまたは NSString オブジェクトとしてボックス化し、そのオブジェクトを返すことができます。(ここでは NSNumber リテラルが非常に便利です)

唯一の不器用な部分は、配列次元の要素数に基づいて、テーブルの列数をプログラムで構築することを決定したい場合があります。必要に応じてテーブルの列を追加または削除します。これは、コードでテーブル ビューを作成するための良い練習になります。テーブルビューの一部を理解するのに役立ちます。

ええと、C 配列を作成するときに、C 配列のサイズを何らかの方法で知って、配列の最後を歩かないようにする必要があります... (C の落とし穴...)

于 2013-03-19T14:51:49.807 に答える
0

arrayOfArraysインスタンス変数だと思いますか?もしそうなら、はい、あなたが見ている問題は、arrayOfArrays項目を追加しようとする前に初期化 (作成) していないという事実から発生します。

でこれを行うこともできますがawakeFromNib、私は通常 で行いinitます。ARC を使用していない場合は、arrayOfArraysininitreleaseinの作成のバランスを取りdeallocます。

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

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

Objective-C でオブジェクトを初期化 ( ) すると、プリミティブ型とObjective-C オブジェクトinit*のインスタンス変数が自動的に設定されます。元のコードでは、行のような行は基本的に と同等、つまり にメッセージを送信します。これは Objective-C で許可されており、その結果、メッセージは単純に無視されます。メソッドは0 を返す「解決」するため、アプリはわざわざメソッドを呼び出す必要はありません (それが呼び出されたとしても、同様に返されます)。0nil[arrayOfArrays addObject:array1];[nil addObject:array1];nilnumberOfRowsInTableView:return [nil count];tableView:objectValueForTableColumn:row:nil

于 2013-03-19T15:11:22.927 に答える
0

あなたの初期配列は次のとおりです。

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

次の方法で 1 次元配列を作成できます。

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

arrayOfArraysこれで、データ ソースとして使用できます。

編集:

この種の表現はあなたにとってうまくいくでしょうか?

ここに画像の説明を入力

于 2013-03-18T18:30:27.813 に答える