NSMatrix绑定混乱



我想使用NSMatrix来表示跨6天工作周(6行)的员工(列)的调度矩阵。仅供参考,由于NSTableView不支持逐单元拖放,我不得不转而使用NSMatrix。游手好闲的人。

无论如何,如果我想使用Cocoa绑定,那么我的contentNSArray需要在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:),但这似乎比它值得更多的麻烦。

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

相关内容

  • 没有找到相关文章

最新更新