【问题标题】:NSMatrix bindings mayhemNSMatrix 绑定混乱
【发布时间】:2014-09-24 03:26:00
【问题描述】:

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

无论如何,如果我想使用 Cocoa 绑定,那么我的 NSArraycontent 需要在 NSMatrix 上水平工作。

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

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

尤扎。

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

【问题讨论】:

    标签: cocoa-bindings nsmatrix


    【解决方案1】:

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

     0  1  2  3  4
     5  6  7  8  9
    

    因此,我与您分享几个代码 sn-ps... 例如,对此结果执行 [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:),但这似乎比它的价值更麻烦。

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

    【讨论】:

      猜你喜欢
      • 2014-03-30
      • 1970-01-01
      • 2011-09-15
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      • 2020-12-28
      相关资源
      最近更新 更多