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

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

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

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

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

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

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];
}

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

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

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

Другие вопросы по тегам