0

NSMatrix週 6 日 (6 行) の従業員 (列) のスケジューリング マトリックスを表すために使用したいと考えています。参考までに、NSTableViewセルごとのドラッグ アンド ドロップをサポートしていないため、NSMatrix代わりに使用する必要があります。残念。

とにかく、Cocoa バインディングを使用したい場合は、を横切って水平に動作する必要がNSArrayあります。contentNSMatrix

従業員が 1 人の場合、配列には 6 つの項目が含まれます。とった。ただし、2 番目の従業員を追加すると、従業員 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

これ以上苦労することなく、n 行の目的の高さの少なくとも 1 列の初期サイズを割り当てることで、制御された配列とそのコンテンツ配列を連携させるNSMatrixサブクラスの 2 つのメソッドを次に示します。NSArrayControllerNSMatrix

// 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-08-01T17:03:02.970 に答える