Подтвердить что ты не робот

"[something copyWithZone:]: непризнанный селектор, отправленный экземпляру" при использовании Bindings/Core Data

(self ask and self-answer, потому что я потратил несколько часов в Интернете и искал это, и большинство ресурсов все говорят "я решил это в конце", не давая объяснений)

У меня было очень простое приложение Core Data + Bindings:

  • NSArrayController вытаскивает элементы из Core Data​​li >
  • Предоставление NSTableView
  • Другой NSTableView, который при нажатии на строку в первой таблице отображает сведения об этом элементе

Пункт 3 выше вызывал крах приложения с ошибкой:

[(my NSManagedObject) copyWithZone:]: unrecognized selector sent to instance

Внедряя этот метод (!) и помещая там точку останова, я обнаружил, что он был вызван классом Apple NSCell - это не помогло: (.

4b9b3361

Ответ 1

Выключает ВСЕ, что необходимо для запуска этого, и XCode позволяет вам делать что-то неправильное в 99,9% ситуаций, если не на 100%.

  • Объекты Core-Data не могут реализовать copyWithZone: - это вызывает сбой

  • Когда tableview заполняется с помощью Bindings, он пытается скопировать значения объектов в NSArrayController для отображения каждого столбца

  • ... но если вам не удалось полностью указать привязку столбца (Xcode позволяет вам указать его половину), тогда tableview пытается "копировать" объекты, а не их значения.

Ошибка в моих привязках: я указал, что столбец таблицы имеет "значение" с:

Контрольный ключ = "организованные объекты" Путь к ключу модели = (пробел)

(это ошибка в автозаполнении XCode4 - при удалении слишком быстро удаляется поле ModelKeyPath)

Завершите ввод привязки, например:

Путь ключа модели = "значение"

... и все работает снова.

Ответ 2

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

пустой определенный объект:

Неверный код:

@property (nonatomic, copy, readwrite) MSender * sender;

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

Введите код:

@property (nonatomic, strong, readwrite) MSender * sender;

Надеюсь, что это поможет кому-то.

Ответ 3

Спасибо за это решение, он указал мне в правильном направлении. Для тех из вас, кто изучает InterfaceBuilder, я надеюсь, что эта дополнительная информация поможет.

Оказывается, создавая учебник, который я непреднамеренно связал с Text field Cell - Text Cell с моим ArrayController.ObjectValue.
Предполагалось, что реальное связывание произойдет при

Table Column > Table Cell View > Static Text - Table View Cell

Это было правильно, но визуально в дереве под ним (по причинам, которые я пока не понимаю, IB нуждается в Text Field Cell.) Я также связал:

Table Column > Text Field Cell - Text Cell

Это было второе обязательство, которое пытается скопировать весь объект, потому что путь был objectValue без ключа, он запускал эту ошибку.

Вероятно, ошибка новичка, но это означало прохождение через объект EVERY и проверку привязок, и я наткнулся на этот один.

Ответ 4

Как подсказка, чтобы избежать каких-либо проблем с привязкой, можно преобразовать NSManagedObject в NSDictionary при заполнении контроллеров: [object dictionaryWithValuesForKeys:[[object entity] attributeKeys]], гораздо проще подключиться и отлаживать: -)

Спасибо за указатель, кстати!

Ответ 5

У меня также была аналогичная проблема, и она исходила от вызова ProxyObject, а не из фактического объекта из контроллера массива.

Например:

MYEntity *entity = EntityController.selection;
NSString *property = entity.property;   // <--- causes the error

но

MYEntity *entity = EntityController.selectedObjects firstObject]; // <--- fixes the error
NSString *property = entity.property;   

Ответ 6

Случайно столкнулся с этой проблемой.

После небольшого расследования выяснилось, что причина была неправильной. cocoa опция привязки, установленная на NSTextField -cell-объекте.

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

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

Проблема была устранена отключением привязки.

Ответ 7

Я получил это, когда вернул представление из NSTableViewDataSource функции -tableView:objectValueForTableColumn:row:. Вместо этого предполагается вернуть значение (например, NSString*). (Не удивительно, учитывая его имя, но ошибка не помогает в обнаружении этого. Функция, о которой я думал, -tableView:viewForTableColumn:row: в NSTableViewDelegate.)

Ответ 8

Я столкнулся с этой ошибкой, когда попытался реализовать привязку master-detail. Что-то аналогичное Департаменту/Сотруднику. Я попытался связать arrayController с "selection.employees" отдела и получил:

- [Employee copyWithZone:]: непризнанный селектор, отправленный в экземпляр

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