我想使用NSMatrix
来表示跨6天工作周(6行)的员工(列)的调度矩阵。仅供参考,由于NSTableView
不支持逐单元拖放,我不得不转而使用NSMatrix
。游手好闲的人。
无论如何,如果我想使用Cocoa绑定,那么我的content
的NSArray
需要在NSMatrix
上水平工作。
如果我有一个雇员,我的数组将包含6个项目。明白了。然而,如果我添加第二个员工,那么员工1的数据需要占用偶数数组索引(0-2-4-6-8-10),员工2的数据占用奇数数组索引(1-3-5-7-9-11)。
如果我现在要删除雇员1,那么我需要按顺序删除条目10、8、6、4、2、0 !
Yowza .
我读的对吗?还有谁不得不满足于这种疯狂?
实际上,我最初的断言是正确的——也就是说,对于内容的底层数组,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
,其中至少有一列的期望高度为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];
}
我意识到我可以用数组索引创建一个NSMutableIndexSet
,并一举影响NSMatrix的数组(与insertObjects:atArrangedObjectIndexes:
和removeObjectsAtArrangedObjectIndexes:
),但这似乎比它值得更多的麻烦。
从数组中插入/删除连续行的代码留给读者(更容易)练习;-)