0

我想用它NSMatrix来表示一周工作 6 天(6 行)中员工(列)的调度矩阵。仅供参考,由于NSTableView不支持逐个单元格的拖放,我不得不求助于使用NSMatrix。真可惜。

无论如何,如果我想使用 Cocoa 绑定,那么我需要NSArray在.contentNSMatrix

如果我有一名员工,我的数组将包含 6 个项目。知道了。但是,如果我添加第二个员工,那么员工 1 的数据需要占用偶数数组索引 (0-2-4-6-8-10),而员工 2 的数据需要占用奇数索引 (1-3-5-7- 9-11)。

如果我现在要删除员工 1,那么我需要按顺序删除项目 10、8、6、4、2、0!

约扎。

我读对了吗?还有其他人不得不满足于这种疯狂吗?

4

1 回答 1

0

事实上,我最初的断言是正确的——即,使用底层的内容数组,NSMatrix将内容从左到右然后从上到下排列。5x2 矩阵中包含 10 个元素的数组将使用以下索引进行布局:

 0  1  2  3  4
 5  6  7  8  9

因此,我与您分享几个代码片段......例如,[self insColAtIndex:self.matrix.numberOfColumns]在一个新矩阵中对此结果进行调用,其中新项目“X”附加到最后一列:

 0  1  2  3  4  X
 5  6  7  8  9  X

事不宜迟,通过分配一个NSMatrix具有至少 1 列所需高度的 n 行的初始大小,以下是子类中的两种方法,NSArrayController以使受控NSMatrix数组及其内容数组协同工作:

// insert NSMatrix column at index (zero-based)
-(void)insColAtIndex:(NSInteger)index
{
    NSInteger colCount = self.matrix.numberOfColumns;
    if (index<0 || index>colCount)
        return;
    NSInteger rowCount = self.matrix.numberOfRows;

    [self.matrix addColumn];
    for (NSInteger i=0; i<rowCount; i++)
        [self insertObject:[[NSCell alloc] init] atArrangedObjectIndex:index+colCount*i+i];
}

// remove NSMatrix column at index (zero-based)
-(void)delColAtIndex:(NSInteger)index
{
    NSInteger colCount = self.matrix.numberOfColumns;
    if (index<0 || index>=colCount)
        return;
    NSInteger rowCount = self.matrix.numberOfRows;

    [self.matrix removeColumn:index];
    for (NSInteger i=rowCount-1; i>=0; i--)
        [self removeObjectAtArrangedObjectIndex:index+colCount*i];
}

我意识到我可以创建一个NSMutableIndexSetwith 数组索引并一举影响 NSMatrix 的数组(with insertObjects:atArrangedObjectIndexes:and removeObjectsAtArrangedObjectIndexes:),但这似乎比它的价值更麻烦。

从数组中插入/删除连续行的代码留给读者作为(更容易)练习;-)

于 2014-08-01T17:03:02.970 回答