it-swarm.com.ru

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

(я спрашиваю себя и отвечаю сам за себя, потому что я часами просиживаю в Интернете, и большинство ресурсов говорят: «В конце концов, я решил», не объясняя)

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

  • NSArrayController извлекает элементы из базовых данных
  • NSTableView рендеринг их
  • Другой NSTableView, который при нажатии на строку в первой таблице отображает детали этого элемента

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

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

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

29
Adam

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

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

  2. Когда табличное представление заполняется с использованием привязок, оно пытается скопировать значения объектов в NSArrayController для визуализации каждого столбца

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

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

Клавиша контроллера = "agedObjects " Путь к ключевой модели = (пусто)

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

Закончите вводить переплет, например:

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

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

25
Adam

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

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

Неправильный код:

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

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

Написать код:

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

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

8
GoodStuff

Спасибо за это решение, оно указало мне правильное направление. Для тех, кто изучает 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 без ключа, она вызывала эту ошибку.

Вероятно, ошибка новичка, но это означало проходить КАЖДЫЙ объект и проверять наличие привязок, и я наткнулся на это один .

6
user445658

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

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

3
Daniele Bernardini

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

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

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

1
Elise van Looij

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

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

 enter image description here

 enter image description here

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

0
Astoria

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

Например:

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

но

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

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

0
prewett