Как обновить NSTableView без использования -reloadData? - PullRequest
15 голосов
/ 20 октября 2010

Я новичок в Mac.Я пытаюсь обновить определенную ячейку в NSTableView без использования -reloadData, так как -reloadData обновляет всю таблицу.Я перепробовал все, но все было напрасно.Я пытаюсь сделать что-то похожее на то, что мы использовали в CListCtrl в MFC или .NET.

Ответы [ 5 ]

29 голосов
/ 20 октября 2010

Взгляните на reloadDataForRowIndexes:columnIndexes: метод. Для обновления одной ячейки должно работать следующее:

[yourTable reloadDataForRowIndexes:[NSIndexSet indexSetWithIndex:row]  
                     columnIndexes:[NSIndexSet indexSetWithIndex:column]];
19 голосов
/ 06 ноября 2010

Это фундаментальное различие между тем, как представления обычно работают в Какао, и тем, как они работают в некоторых других средах.NSTableView действительно предоставляет -reloadDataForRowIndexes:columnIndexes: API, как указывает Владимир, но вы заметите отсутствие параметра «withObject:».

Это потому, что представления и элементы управления Какао не предназначен также для использования в качестве контейнеров данных.Скорее, они предназначены для представления и взаимодействия с данными, которыми управляет какой-либо другой объект модели, обычно через некоторый промежуточный контроллер.

Например, с учетом табличного представления, если ваша модель сообщила вашемуКонтроллер, который изменил некоторые конкретные данные, контроллер может сделать недействительной отображаемую часть таблицы, которая отображается на это значение - если даже есть отображаемая часть таблицы.В следующий раз, когда она отрисовывает себя, таблица запросит у своего источника данных (контроллера) значения, которые нужно представить для области, которую нужно перерисовать.

Таким образом, несмотря на поверхностное сходство во взаимодействии с пользователем, вы, вероятно,хочу пересмотреть, как вы пишете код для реализации вашего пользовательского интерфейса.В итоге вы получите гораздо более разборчивый код стиля Model-View-Controller;цена заключается в том, что вам нужно будет на самом деле представлять свою модель более тщательно, чем вы могли бы иметь в рамках, которые не требовали такого разделения интересов.

2 голосов
/ 12 сентября 2016

Полный пример использования 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)]
];
0 голосов
/ 10 октября 2018

Если ваша строка таблицы достаточно умна, чтобы обновить себя с помощью рисования, вы можете сделать что-то вроде этого Этот метод ViewController отвечает на сообщение NSNotification исходным объектом, который обновил себя.

Код Swift 4:

class ObjectChooserListViewController: NSViewController, NSTableViewDataSource, NSTableViewDelegate {

    @IBOutlet weak var tableView: NSTableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self, selector: #selector(objectUpdating(_:)), name: NSNotification.Name("ObjectUpdating"), object: nil)
        // more stuff happening
    }

    @objc func objectUpdating(_ notification: NSNotification) {
        guard let object = notification.object as? MyCoolObject else {return}
        guard let row = ObjectManager.shared.getRow(of: object.id) else {return}
        guard let cellView = tableView.view(atColumn: 0, row: row, makeIfNecessary: false) else {return}
        cellView.draw(tableView.frameOfCell(atColumn: 0, row: row))
    }
}
0 голосов
/ 21 октября 2010

Обычно обновление всей таблицы с помощью reloadData: - это правильный шаблон проектирования. Почему вы против этого? Это из соображений эффективности, или вы полагаетесь на таблицу, чтобы сохранить какое-то состояние и перезагрузка всех данных мешает этому? Последнее обычно является признаком того, что вам нужно переосмыслить свою архитектуру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...