Какао-использование представленного объекта для NSButton в NSCollectionView

Настройка

У меня есть NSCollectionView. У меня есть флажок в View Prototype. Я успешно настроил привязки, поэтому Card Title и action заполняются. (изображение 1 ниже)

Цель

Я хотел бы, когда я устанавливаю флажок, запускать функцию, которая обращается к конкретному CardModel, к которому уже может получить доступ View Prototype. Затем я буду соответствующим образом манипулировать его данными.

Исследования

Я нашел эту статью на SO: Получить значения представленного объекта NSCollectionViewItem NSButton click, что довольно хорошо описывает мою ситуацию. Ответ, к сожалению, без конкретного кода. Вот что предлагается:

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

Кажется достаточно простым, не так ли?

Попытки решения

Я создаю метод cardCheckBoxClicked: и подключаю его к флажку.

В соответствии с советом выше, я подключаю розетку representedObject button cell к Card Collection View Item. (изображение 2)

Затем я пытаюсь получить Card Collection View Item representedObject в коде.

От MainWindowController.h:

-(IBAction)cardCheckBoxClicked:(id)sender
{
    CardModel* cModel = [[sender representedObject] representedObject];

    NSLog(@"card title: %@",cModel.title);
}

Ошибка

Когда я нажимаю на флажок, я получаю следующую ошибку:

-[NSButton representedObject]: unrecognized selector sent to instance 0x6080001581b0

Вопрос!

Итак, как мне получить доступ к объекту, представленному button cell? Я неправильно понял совет, данный выше? Как я могу успешно получить доступ к нужным мне данным?

Изображения (ссылка)

пример привязки введите здесь описание изображения

соединение представленного объекта введите здесь описание изображения


person ryantuck    schedule 02.07.2014    source источник


Ответы (2)


Это здесь:

-[NSButton representedObject]:

Вы просите класс NSButton запустить метод, представленный Object. Убедитесь, что вы различаете класс и объект или экземпляр этого класса.

Вам нужно взять фактическую кнопку, получить ее ячейку кнопки (по крайней мере, я думаю, что это то, что вы хотите), а затем вызвать представленный объект в ячейке. Если я правильно вас понимаю. Я никогда не прикасаюсь к конструктору интерфейсов, поэтому вот полностью составленный код, который соответствует тому, что вы просите.

someObject = [[theButton cell] representedObject];
person Cooper Buckingham    schedule 02.07.2014
comment
Это по сути правильно. Для конкретного случая в вопросе он хочет CardModel* cModel = [[[sender cell] representedObject] representedObject];. - person Ken Thomases; 03.07.2014
comment
ах - бит [ячейка отправителя] сделал это. Из справочных документов Apple по классу NSButton у меня сложилось впечатление, что мне не нужно иметь дело с ячейкой, и что NSButton позаботится обо всем соответственно. - person ryantuck; 03.07.2014
comment
для общего удобства SO, должен ли я отредактировать свой вопрос до минимальной части моего кода, которая вызывала проблему? Или желательно оставить как есть, с включением посторонних деталей? - person ryantuck; 03.07.2014

В дополнение к ответу CH Buckingham вам также следует рассмотреть возможность использования привязок. Вы можете привязать привязку значения флажка к элементу представления коллекции с помощью пути ключа модели, который проходит через representedObject к некоторому свойству на вашем CardModel. (При желании ключевой путь может продолжать проходить через граф объектов вашей модели.) Это будет устанавливать это свойство всякий раз, когда кнопка переключается.

person Ken Thomases    schedule 03.07.2014
comment
Кен, моя текущая реализация требует, чтобы флажок вызывал функцию, делая больше, чем переключение свойства. Я согласен с тем, что привязки — это более чистый и простой способ доступа к моим CardModel данным, и уже реализовал их там, где это возможно. - person ryantuck; 03.07.2014
comment
Переключение свойства является вызовом метода. В частности, установщик свойства. - person Ken Thomases; 03.07.2014