Как обновить NSTableView без использования -reloadData?
Я новичок в Mac. Я пытаюсь обновить определенную ячейку в NSTableView без использования -reloadData
, так как -reloadData
обновляет всю таблицу. Я пробовал все, но все было напрасно. Я пытаюсь сделать что-то подобное тому, что мы делали в CListCtrl в MFC или .NET.
Ответы
Ответ 1
Посмотрите на метод reloadDataForRowIndexes:columnIndexes:
. Чтобы обновить одну ячейку, необходимо выполнить следующее:
[yourTable reloadDataForRowIndexes:[NSIndexSet indexSetWithIndex:row]
columnIndexes:[NSIndexSet indexSetWithIndex:column]];
Ответ 2
Это принципиальное различие между тем, как представления, как правило, работают в Cocoa и как они работают в некоторых других средах. NSTableView раскрывает API -reloadDataForRowIndexes:columnIndexes:
, как указывает Владимир, но вы заметите отсутствие параметра "withObject:".
Это связано с тем, что представления Cocoa и элементы управления не, предназначенные также для работы в качестве контейнеров данных. Скорее, они предназначены для представления и взаимодействия с данными, которыми управляет какой-либо другой объект модели, обычно с помощью промежуточного контроллера.
Учитывая представление таблицы, например, если ваша модель сообщила вашему контроллеру о том, что некоторые данные были изменены, контроллер может аннулировать отображаемую часть таблицы, которая сопоставляется с этим значением, - если даже отображается отображаемая часть Таблица. В следующий раз, когда он заберет себя, таблица спросит его источник данных (контроллер) о том, какие значения будут представлены для области, которую необходимо перерисовать.
Таким образом, несмотря на поверхностное сходство в пользовательском взаимодействии, вы, вероятно, захотите пересмотреть, как вы пишете код для реализации вашего пользовательского интерфейса. В конце вы столкнетесь с гораздо более упорядоченным кодом стиля Model-View-Controller; цена заключается в том, что вам нужно будет реально представить свою модель более тщательно, чем вы, возможно, должны были в рамках, которые не требовали такого разделения проблем.
Ответ 3
Полный пример использования reloadDataForRowIndexes для обновления всех строк, но только одного столбца:
int col = 2 ;
[self.myTable reloadDataForRowIndexes:
[NSIndexSet indexSetWithIndexesInRange:
NSMakeRange(0,self.myTable.numberOfRows)]
columnIndexes:
[NSIndexSet indexSetWithIndex:col]
];
Или все столбцы для одной строки:
int row = 2 ;
[self.myTable reloadDataForRowIndexes:
[NSIndexSet indexSetWithIndex:row]
columnIndexes:
[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0, self.myTable.numberOfColumns)]
];
Ответ 4
Обычно обновление всей таблицы через reloadData:
является правильным шаблоном проектирования. Почему вы не можете этого сделать? Это по соображениям эффективности, или вы полагаетесь на таблицу, чтобы сохранить какое-то состояние и перезагружать все данные, препятствующие этому? Последнее обычно является признаком того, что вам нужно переосмыслить свою архитектуру.