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