Удаление столбца и его заголовка из NSTableView

ПРИМЕЧАНИЕ. Ответ Эндрю заставил меня взглянуть еще раз. Эта функция скрыта глубоко в большом приложении, имеющем встроенный таймер. Если этот таймер выключен, я получаю неправильное поведение, описанное здесь. Если таймер включен, все работает как положено. Я не знаю, почему этот таймер взаимодействует с этим табличным представлением, но, как я уже сказал, это большое и сложное приложение.

Я хочу, чтобы пользователь мог выбирать, какие столбцы отображать. Ему будет представлен набор переключателей или флажков, по одному для каждой клавиши в отображаемом объекте. Он может установить или снять флажок, и NSTableView добавит или удалит столбец для этого ключа.

Отображаемый объект является NSDictionary. Ключи словаря неизвестны до времени выполнения, поэтому мне приходится создавать столбцы с идентификаторами во время выполнения... они неизвестны во время компиляции.

Внедрение добавочной функциональности прошло гладко. Я создаю столбец и ячейку заголовка, устанавливая текст ячейки заголовка на некоторое значение. Но удалить не так просто. [myTableView removeTableColumn:col] удаляет столбец, но не так хорошо работает с заголовком. Иногда текст заголовка не удаляется. Иногда удаляется текст заголовка в двух столбцах. Иногда я получаю две текстовые строки заголовка, напечатанные друг над другом.

Явно что-то упускаю. Как программно удалить столбец и его заголовок?


person garyp    schedule 05.05.2012    source источник
comment
Удаление столбца также должно надежно удалить заголовок и его текст. Можете ли вы опубликовать больше своего кода или, что еще лучше, предоставить пример проекта, который раскрывает проблему?   -  person Andrew Madsen    schedule 05.05.2012
comment
У меня есть приложение с этим функционалом. В основном вы создаете таблицу со всеми столбцами. Затем во время выполнения вы можете изменить видимость столбцов, поэтому вы на самом деле никогда не добавляете и не удаляете столбцы... вы просто делаете их видимыми или невидимыми.   -  person regulus6633    schedule 07.05.2012


Ответы (2)


Это легко достижимо, вызвав эти два метода из селектора флажка.

Чтобы добавить столбец динамически, вы должны вызвать это:

- (void)addColumnWithCheckboxToTable:(NSTableView *)table :(NSString *)header
{
    NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:header];
    [[column headerCell] setStringValue:header];

    // Add column to table
    [table addTableColumn:column];
}

И чтобы удалить столбец, вызовите этот:

- (void)removeColumnWithCheckboxFromTable:(NSTableView *)table :(NSString *)header
{
    NSTableColumn *column = [table.tableColumns objectAtIndex:[table columnWithIdentifier:header]];
    [table removeTableColumn: column];
}
person Gossamer    schedule 31.03.2013

Я немного опоздал на эту тему, но недавно столкнулся с очень похожей ситуацией.

Оказалось, что в тех случаях, когда я модифицировал структуру NSTable в основном потоке, все работало нормально. Однако иногда изменения происходили в другом потоке, что вызывало вышеупомянутые проблемы.

Как обычно, весь код, который изменяет пользовательский интерфейс, должен быть в основном потоке, поэтому исправление было относительно простым: весь этот код должен выполняться в основном потоке.

person aLevelOfIndirection    schedule 16.12.2013