在NSTableView中显示2D数组

时间:2013-03-18 18:27:12

标签: objective-c macos cocoa

我正在尝试通过尝试转换我在C中编写的程序来学习Objective C.该程序使用大型2维数组并对它们进行计算,因此我需要能够显示2D数组UI上的表格格式。我能做到这一点的最好方法是将我的C风格数组逐行转换为NSMutableArrays,然后将“row”NSMutableArrays存储在另一个NSMutableArray中作为“堆栈行”传递给NSTableView。 (如果有更好的方法,请告诉我。)

我遇到的问题是我似乎无法将它们存储在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的dataSource。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

您可以使用表视图数据源方法来完成工作。

tableView:objectValueForTableColumn:row:numberOfRowsInTableView:

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

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

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

嗯,你仍然需要知道你的C数组的大小,以避免在它的结尾处走开...(C陷阱...)

答案 2 :(得分:0)

我认为arrayOfArrays是一个实例变量?如果是,那么是的,您看到的问题源于您在尝试向其添加项目之前未初始化(创建)arrayOfArrays这一事实。

虽然您可以在awakeFromNib中执行此操作,但我通常会在init中执行此操作,如果您不使用ARC,请在arrayOfArrays中平衡init的创建在release中使用dealloc

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

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

在Objective-C中初始化(init*)对象时,实例变量会自动设置为原始类型的0和Objective-C对象的nil。在原始代码中,[arrayOfArrays addObject:array1];之类的行基本上等同于[nil addObject:array1];,换句话说,就是向nil发送消息。在Objective-C中允许这样做,结果就是忽略了消息。 numberOfRowsInTableView:方法将“解析”为return [nil count];,返回0,因此您的应用程序不会打扰调用tableView:objectValueForTableColumn:row:方法(即使调用它,它也会返回{ {1}}也是如此。