Связывание отдельного NSCELL с несколькими значениями

StackOverflow https://stackoverflow.com/questions/4751589

  •  13-10-2019
  •  | 
  •  

Вопрос

Я уже убил день на эту тему и все еще понятия не имел, как это можно сделать правильно.

я использую NSOutlineView Чтобы отобразить иерархию файловой системы. Для каждой строки в первом столбце мне нужно отобразить флажок, связанный значок и имя файла или каталога. Так как нет стандартного способа сделать это, я подкласс NSTextFieldCell Использование примеров как SourceView, так и Poneyearch, привязка value в IB to name Свойство моего класса предметов дерева хотя NSTreeController. Анкет я использую drawWithFrame:inView: Переопределить флажок и изображение, пересылая текстовое чертеж в super. Анкет Я также использую trackMouse:inRect:ofView:untilMouseUp: Переопределить, чтобы обработать взаимодействие с флажом.

Все было хорошо, пока я не заметил, что, как только я нажимаю кнопку мыши в мою пользовательскую ячейку, Cell -объект копируется с copyWithZone: и этот временный объект затем отправляется trackMouse:inRect:ofView:untilMouseUp: Сообщение, делая невозможным изменение состояния проверки исходной ячейки, находящейся в представлении.

Поскольку вопрос вопроса о связывании, я подумал, что это может быть ответом, но я полностью не понимаю, как мне подключить весь этот беспорядок, чтобы функционировать, как и ожидалось. Попробовал это:

[[[treeView outlineTableColumn] dataCell] bind:@"state"
                                      toObject:treeController
                                   withKeyPath:@"selection.state"
                                       options:nil];

Но совсем не успел. Похоже, я не понимаю.

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


UPD 21.01.11: Я также попробовал это:

[[[treeView outlineTableColumn] dataCell] bind:@"state"
                                      toObject:treeController
                                   withKeyPath:@"arrangedObjects.state"
                                       options:nil];

но продолжал получать ошибки, такие как «[<_nscontrollertreeproxy 0x ...> valueForundefinedKey:]: Этот класс не является значением ключа, соответствующего кодирующему состоянию». и аналогично.

Это было полезно?

Решение 2

Хорошо, мне удалось сделать то, что мне было нужно, привязав столбцы value к arrangedObjectS. self (в IB) и переопределение ячейки setObjectValue: так что это похоже на:

- (void) setObjectValue:(id)value
{
    if ([value isMemberOfClass:[MyNodeClass class]])
    {
        [super setObjectValue:[value name]];
        [self setIcon:[value icon]];
        [self setState:[value state]];
    }
    else
    {
        if (!value)
        {
            [self setIcon:nil];
            [self setState:NSOffState];
        }
        [super setObjectValue:value];
    }
}

Действительный state Изменения выполняются в другом классе, соединяя свой метод с ячейкой selector (в IB), который я называю, используя

[NSApp sendAction:[self action] to:[self target] from:[self controlView]];

от Cell's trackMouse:inRect:ofView:untilMouseUp:. Анкет Это другой метод класса выглядит следующим образом:

- (IBAction) itemChecked:(id)sender
{
    MyNodeClass* node = [[sender itemAtRow:[sender clickedRow]] representedObject];
    if (node)
    {
        [node setState:[node state] == NSOnState ? NSOffState : NSOnState];
    }
}

Другие советы

Вы связываете значение столбца таблицы (или наброски), а не отдельное состояние ячейки данных. Значение объекта ячейки данных устанавливается на текущее значение строки/Col, затем нарисовано, чтобы у вас не было потенциально тысячи (или миллионов?) Ячейки, созданных без веской причины.

Кроме того, вы хотите контроллер дерева или массива Аранжировки, не его выбор.

Связывать колонны значение для контроллера дерева Аранжировки как ключ контроллера и «состояние» как путь ключа модели в IB; или @"ArangedObjects.state" в коде, как указано выше.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top