Objective c 在NSTableView中显示二维阵列

Objective c 在NSTableView中显示二维阵列,objective-c,macos,cocoa,Objective C,Macos,Cocoa,我试图通过转换我用C编写的一个程序来学习Objective C。该程序使用大型二维数组并对其进行计算,因此我需要能够在UI上以表格格式显示二维数组。我能想到的最好的方法是将我的C样式数组逐行转换为NSMutableArray,然后将“行”NSMutableArray存储在另一个NSMutableArray中,作为“行堆栈”传递给NSTableView。(如果有更好的办法,请告诉我。) 我遇到的问题是,我似乎无法将它们存储在ArrayOfarray中。它只是空的。我确信我犯了一个愚蠢的noob错误

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

我遇到的问题是,我似乎无法将它们存储在ArrayOfarray中。它只是空的。我确信我犯了一个愚蠢的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
intgrid[3][3]={{1,2,3},{4,5,6},{7,8,9};
NSMutableArray*阵列远射线;
int x=0;
-(无效)从NIB中唤醒
{
NSMutableArray*array1=[[NSMutableArray alloc]init];
NSMutableArray*array2=[[NSMutableArray alloc]init];
NSMUTABLEARRY*array3=[[NSMUTABLEARRY alloc]init];
对于(int y=0;y<3;y++){
[array1 addObject:[NSNumber Number Withint:grid[x][y]];
}
x++;
对于(int y=0;y<3;y++){
[array2 addObject:[NSNumber Number Withint:grid[x][y]];
}
x++;
对于(int y=0;y<3;y++){
[array3 addObject:[NSNumber numberwhithint:grid[x][y]];
}
[arrayOfArrays添加对象:array1];
[arrayOfArrays添加对象:array2];
[arrayOfArrays添加对象:array3];
}
-(NSInteger)表视图中的行数:(NSTableView*)或表视图
{
返回[arrayOfArrays计数];
}
-(id)tableView:(NSTableView*)aTableView对象值FORTableColumn:(NSTableColumn*)aTableColumn行:(NSInteger)行索引
{
返回[arrayOfArrays对象索引:行索引];
}
@结束

哦,这个对象是一个NSTableViewSource,它是NSTableView的数据源。

您的初始数组是:

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]];
   }
}
NSMutableArray*arrayOfArrays=[NSMutableArray new];
对于(int i=0;i您不必将C数组转换为对象。这可能是一个巨大的不必要的工作,除非您只是想这样做。Objective-C的一个经验教训是C仍然存在,并且仍然被使用和合适。一切不必都是对象。:D

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

tableView:objectValueForTableColumn:row:
numberOfRowsInTableView:

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

tableView:objectValueForTableColumn:row:
实现中,您可以将数组元素值作为NSNumber对象或NSString对象装箱,然后返回该对象。(NSNumber文本在这里非常方便)

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


好的,在创建C数组时,您仍然需要知道它的大小,以避免离开它的末端…(C陷阱…

我假设
arrayOfArrays
是一个实例变量?如果是,那么是的,您看到的问题是由于您没有初始化(创建)而引起的
arrayOfArrays
在尝试向其添加项目之前

虽然您可以在
awakeFromNib
中执行此操作,但我通常在
init
中执行此操作,如果您不使用ARC,请在
init
中创建
arrayOfarray
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:
方法将“解析”为
返回[nil count];
将返回0,这样你的应用程序就不会麻烦调用
tableView:objectValueForTableColumn:row:
方法(即使调用了该方法,也会返回
nil
).

我认为这对我不起作用。根据我对NSTableView的理解,绘制一个一维数组会得到九行一行,我需要三行三行。(除非有其他方式格式化NSTableView。)我仍然无法让*arrayOfArrays接受任何数据。我只是重新阅读了我的原始帖子,我想说我的问题是我无法在*arrayOfArrays中存储任何数据。我留下了一个“'t”检查我的编辑,这里我有一个2D数组,一个包含2Kids,苹果,飞机,第二个包含2Kids,ball,.baloon。不,那不行。它必须是3x3。我使用的例子很简单,只是想尝试一下。在真实的应用程序中,我的网格将是50x50或更大。这是一个带有数学矩阵函数和并排比较的矩阵应用程序ons@JoeSmith:为什么兄弟,你从2D数组开始,现在要求使用nXn数组。这不是问题,你可以在任何级别使用NSOutlineView。在我的回答中,我显示了2x2。谢谢!!这回答了我原来的问题。谢谢!!你给了我一个比我原来做的更好的方法。