Проблемы со шрифтом ячейки заголовка NSOutlineView на основе представления

В настоящее время я пытаюсь использовать новый NSOutlineView на основе представления в своем приложении Cocoa. Поскольку я не использую привязки, я реализовал все необходимые методы делегата и источника данных в своем контроллере.

В построителе интерфейсов я добавил NSOutlineView с выделением, установленным на SourceList, и режимом содержимого, установленным на View Based. Таким образом, было предоставлено два представления ячеек таблицы по умолчанию (одна ячейка заголовка с HeaderCell, установленной в качестве идентификатора, и одна ячейка данных с DataCell, установленной в качестве идентификатора).

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

Чтобы предоставить представления, я использую следующий код, чтобы вернуть представление DataCell или представление HeaderCell и соответствующим образом установить текстовое поле ячейки на основе соответствующего идентификатора, установленного в построителе интерфейса.

- (NSView *)outlineView:(NSOutlineView *)outlineView 
     viewForTableColumn:(NSTableColumn *)tableColumn 
                   item:(id)item {


    NSTableCellView *result = nil;

    if ([item isKindOfClass:[NSMutableDictionary class]]) {
        result = [outlineView makeViewWithIdentifier:@"HeaderCell" owner:self];

        id parentObject = [outlineView parentForItem:item] ? [outlineView parentForItem:item] : groupedRoster;
        [[result textField] setStringValue:[[parentObject allKeys] objectAtIndex:0]];


    } else {
        result = [outlineView makeViewWithIdentifier:@"DataCell" owner:self];

        [item nickname] ? [[result textField] setStringValue:[item nickname]] : [[result textField] setStringValue:[[item jid] bare]];
    }
    return result;
}

Запустив все это выглядит следующим образом.

Может ли кто-нибудь дать мне подсказки, почему ячейка заголовка не выделена жирным шрифтом и не окрашена правильно при выборе?


person BinaryBucks    schedule 17.08.2011    source источник


Ответы (2)


Вам необходимо реализовать -outlineView:isGroupItem: метод делегата и вернуть YES для строк заголовков. Это стандартизирует шрифт и заменит треугольник раскрытия слева кнопкой «Показать/скрыть» справа. Вам все равно придется вручную записывать строку в верхнем регистре, чтобы получить полный эффект.

Я не уверен, что приведенный выше метод делегата групповой строки делает стиль выбора правильным или нет. Однако обычно вы не хотите, чтобы строки заголовков вообще были доступны для выбора в исходных списках, для чего вы возвращаете NO для элементов заголовков из метода -outlineView:shouldSelectItem: delegate.

person Boaz Stuller    schedule 17.08.2011
comment
Отлично, спасибо, это было именно то, что я искал. Если кто-то еще столкнется с проблемой, используйте setFloatsGroupRows:NO, чтобы первый элемент группы не прыгал вверх и вниз при развертывании и сворачивании в соответствии с эта запись - person BinaryBucks; 18.08.2011
comment
Пока я занимаюсь этим сейчас, и все отображается правильно, приведенный выше код работает на самом деле не работает плавно при развертывании/сворачивании группы, как это имеет место, например, в Искатель. Всегда есть небольшое, но заметное заикание в анимации и довольно большая нагрузка на процессор, как будто представление заново выделено. Если я просто использую makeViewWithIdentifer с одним идентификатором, чтобы каждая ячейка была ячейкой заголовка (или ячейкой данных, это не имеет значения), все работает плавно. Любой намек, почему? - person BinaryBucks; 18.08.2011
comment
Да, все свойство floatsGroupRows просто сломано для представлений структуры. Описанной вами проблемы с производительностью не наблюдал. Может быть, регресс Core Animation из суперпредставления с поддержкой слоев? Не знаю. - person Boaz Stuller; 18.08.2011

Я создал небольшой пример проекта, который включает в себя список источников, а также использует метод -outlineView:isGroupItem:, как предложил @boaz-stuller.

  • Показать список элементов
  • Редактируйте элементы в режиме master-detail
  • Удалить и добавить элементы
  • Использование привязок

Проверьте besi/mac-quickies на github. Большая часть материала либо делается в IB, либо может быть найдена в AppDelegate

скриншот

person Besi    schedule 11.10.2013