NSTableView на основе представления дает странные результаты с привязками и делегатом - PullRequest
3 голосов
/ 25 февраля 2012

У меня есть NSTableView, содержимое которого связано с arrayController с использованием filterPredicate. TableView основан на представлении, поэтому его делегат установлен на объект, который имеет

- (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row 

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

cellView.objectValue = [arrayController arrangedObjects] objectAtIndex:row];

что часто это не тот. Есть идеи?

Ответы [ 2 ]

1 голос
/ 12 июля 2014

objectValueForTableColumn не требуется для случая привязок. Просто несколько минут ударился головой о стену и вернулся с этим путем наименьшего сопротивления:

1) привязать содержимое NSOutlineView к контроллеру NSTreeController (клавиша контроллераagedObjects)

2) привязать подпредставления каждого из NSTableCellView к вмещающему NSTableCellView (objectValue.foo, где foo - ключевой путь для целевого поля)

3) установить идентификатор для каждого столбца в виде структуры (я делаю это для отслеживания переупорядочения столбцов таблицы между запусками)

4) убедитесь, что каждый NSTableCellView имеет идентификатор, установленный на Автоматически (или такой же, как столбец таблицы) ** Это важно и напутано со мной **

5) при вызове makeViewWithIdentifier: убедитесь, что вы передали tableColumn.identifier

Это предполагает, что у вас есть только один тип представления ячейки на столбец таблицы. В противном случае вам нужно будет ввести правильный идентификатор для представления ячейки, которое вы хотите, в makeViewWithIdentifier:.

0 голосов
/ 26 февраля 2012

Ну, я до сих пор не могу объяснить, почему представление ведет себя так, как оно есть, но мне удалось заставить вещи вести себя правильно, выполнив следующее:

  • привязка содержимого tableView к arrayOontroller's selectedObjects
  • связывание различных элементов tableCellview, используемых в tableView, с соответствующим keyPath объекта tableCellView objectValue
  • , обеспечивающее каждый tableCellView следующим образом (где BILSelectableRoundedTableCellView оказывается подклассом NSTableCellView):

    (NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {
    
    NSInteger numberOfObjects = [self.arrayController.arrangedObjects count];
    
    if (numberOfObjects == 0)
        return nil;
    
    if (row >= numberOfObjects)
        return nil;
    
    BILSelectableRoundedTableCellView *viewForTableColumnRow = [self.myTableView makeViewWithIdentifier:@"DataCell" owner:self];
    
    return viewForTableColumnRow; }
    

Наконец, используя источник данных, который реализует следующее:

(id)tableView:(NSTableView *)tableView objectValueForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row {

NSInteger numberOfObjects = [self.arrayController.arrangedObjects count];

if (numberOfObjects == 0)
    return nil;

if (row >= numberOfObjects)
    return nil;

return [self.arrayController.arrangedObjects objectAtIndex:row]; }

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

...