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