2

我正在尝试通过转换我用 C 编写的程序来学习 Objective C。该程序适用于大型二维数组并对其进行计算,因此我需要能够以表格格式显示二维数组在用户界面上。我能想到的最好方法是将我的 C 样式数组逐行转换为 NSMutableArrays,然后将“行”NSMutableArrays 作为“行堆栈”存储在另一个 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 的数据源。

4

3 回答 3

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用作您的数据源。

编辑:

这种表现形式对你来说合适吗?

在此处输入图像描述

于 2013-03-18T18:30:27.813 回答
0

您不必C 数组转换为对象。这可能是一个巨大的不必要的努力,除非你只是想这样做。Objective-C 的教训之一是 C 仍然存在并且仍然使用和适当。一切都不必是对象。:D

您可以使用 Table View Datasource 方法来完成这项工作。

tableView:objectValueForTableColumn:row:numberOfRowsInTableView:

在您的numberOfRowsInTableView:实现中,只需返回要用于行的数组维度中的元素计数。

在您的 tableView:objectValueForTableColumn:row:实现中,您可以将数组元素值装箱为 NSNumber 对象或 NSString 对象,然后返回该对象。(NSNumber 字面量在这里会很方便)

唯一笨拙的部分是,您可能仍想决定根据数组维度之一的元素数以编程方式构建表中的列数。根据需要添加或删除表格列。这将为在代码中构建表格视图提供一个很好的练习。它将帮助您理解一些表格视图。

好吧,您仍然需要在创建 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];
}

当您init*在 Objective-C 中初始化 ( ) 对象时,实例变量会自动设置0为原始类型和nilObjective-C 对象。在您的原始代码中,[arrayOfArrays addObject:array1];基本上等同于的行[nil addObject:array1];,或者换句话说,将消息发送到nil. 这在 Objective-C 中是允许的,结果是消息被简单地忽略了。该numberOfRowsInTableView:方法将“解析”return [nil count];返回 0,因此您的应用程序不会费心调用该tableView:objectValueForTableColumn:row:方法(即使调用了该方法,它也会返回nil)。

于 2013-03-19T15:11:22.927 回答