我想使用NSMatrix来表示一个跨6天工作周(6行)的员工(列)的调度矩阵。仅供参考,由于NSTableView不支持逐个单元格的拖放,我不得不转而使用NSMatrix。真扫兴。
无论如何,如果我想使用Cocoa绑定,那么我的content的NSArray需要在NSMatrix上水平地工作。
如果我有一个雇员,我的数组将包含6个项目。明白了。但是,如果我添加第二个雇员,则雇员1的数据需要占用偶数组索引(0-2-4-6-8-10),而雇员2的数据占用奇数组索引(1-3-5-7-9-11)。
如果我现在想删除employee 1,那么我需要按该顺序删除第10,8,6,4,2,0项!
太棒了。
我没看错吧?还有其他人不得不满足于这种疯狂吗?
发布于 2014-08-02 01:03:03
实际上,我最初的断言是正确的-也就是说,对于内容的底层数组,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:),但这似乎比它值得的麻烦更多。
将插入/删除数组中连续行的代码留给读者(容易得多) ;-)
https://stackoverflow.com/questions/25071520
复制相似问题