Хаос привязок NSMatrix

Я хочу использовать NSMatrix для представления матрицы планирования для сотрудников (столбцы) в течение 6-дневной рабочей недели (6 строк). К вашему сведению, поскольку NSTableView не поддерживает перетаскивание ячеек за ячейкой, вместо этого мне приходится прибегать к использованию NSMatrix. облом.

В любом случае, если я хочу использовать привязки Cocoa, то мой NSArray из content должен работать горизонтально через NSMatrix.

Если бы у меня был один сотрудник, мой массив содержал бы 6 элементов. Понятно. Однако, если я добавлю второго сотрудника, то данные сотрудника 1 должны занимать четные индексы массива (0-2-4-6-8-10), а данные сотрудника 2 занимают нечетные индексы (1-3-5-7- 9-11).

Если я сейчас хочу удалить сотрудника 1, то мне нужно удалить пункты 10,8,6,4,2,0 именно в таком порядке!

Йоуза.

Я правильно это читаю? Кому-нибудь еще приходилось довольствоваться этим безумием?


person zzyzy    schedule 01.08.2014    source источник


Ответы (1)


Действительно, мои первоначальные утверждения были правильными, а именно, что с базовым массивом для содержимого NSMatrix размещает это содержимое слева направо, а затем сверху вниз. Массив из 10 элементов в матрице 5x2 будет разбит с такими индексами:

 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 начального размера как минимум с 1 столбцом желаемой высоты из 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:), но это казалось большим трудом, чем того стоило.

Код для вставки/удаления смежных строк из массива оставлен как (гораздо более простое) упражнение для читателя ;-)

person zzyzy    schedule 01.08.2014