web-dev-qa-db-fra.com

"[quelque chose copyWithZone:]: sélecteur non reconnu envoyé à l'instance" lors de l'utilisation de liaisons/données de base

(demande personnelle et réponse automatique parce que j'ai passé des heures sur le Web à chercher cela, et la plupart des ressources disent toutes "je l'ai résolu à la fin" sans donner d'explication)

J'avais une application très simple Core Data + Bindings:

  • Un NSArrayController extrayant des éléments des données de base
  • Un NSTableView les rendant
  • Un autre NSTableView qui, lorsque vous cliquez sur une ligne du premier tableau, affiche les détails de cet élément

L'élément 3 ci-dessus provoquait un blocage de l'application, avec l'erreur suivante:

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

En implémentant cette méthode (!) Et en plaçant un point d'arrêt à cet endroit, j'ai découvert que celle-ci était invoquée par la classe NSCell d'Apple.

29
Adam

Il s'avère que TOUS les éléments ci-dessus sont nécessaires pour déclencher cela, et XCode vous permet de faire quelque chose qui ne va pas dans 99,9% des cas, voire à 100%.

  1. Les objets Core-Data ne peuvent pas implémenter copyWithZone: - cela provoque le crash

  2. Lorsqu'une table est remplie à l'aide de Bindings, elle tente de copier le values ​​ des objets dans NSArrayController pour rendre chaque colonne.

  3. ... mais si vous ne parvenez pas à spécifier complètement la liaison de colonne (Xcode vous permet de la spécifier à moitié), alors tableview essaye la "copie" sur les objets au lieu de leurs valeurs

Le bogue dans mes liaisons: j'avais spécifié qu'une colonne de table avait une "valeur" avec:

Clé de contrôleur = "arrangéObjets", chemin de la clé de modèle = (vide)

(Il s'agit d'un bogue dans la saisie semi-automatique de XCode4 - le champ ModelKeyPath sera parfois supprimé lorsque vous vous en tirerez trop vite)

Terminez la saisie de la reliure, par exemple:

Chemin de la clé de modèle = "valeur"

... et tout fonctionne à nouveau.

25
Adam

J'aimerais aussi poster ici parce que j'avais un problème similaire avec le même genre de chose

objet défini vide:

Mauvais code:

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

cela devrait générer une erreur de compilation car avec le comptage de références, Xcode n'a aucune idée de la façon de copier mon objet. Au lieu de cela, il échoue au moment de l'exécution ...

Écrire le code:

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

J'espère que ça aide quelqu'un.

8
GoodStuff

Merci pour cette solution, cela m'a orienté dans la bonne direction. Pour ceux qui apprennent InterfaceBuilder J'espère que ces informations supplémentaires vous aideront.

En construisant un tutoriel, j’avais par inadvertance lié un Text field Cell - Text Cell à mon ArrayController.ObjectValue.
La véritable liaison était censée se produire à

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

Celui-ci était correct, mais visuellement dans l'arbre en dessous (pour des raisons que je ne comprends pas encore, IB a besoin d'un Text Field Cell.) J'avais aussi lié:

Table Column > Text Field Cell - Text Cell

C’était cette deuxième liaison qui tentait de copier l’ensemble de l’objet car le chemin était objectValue sans clé, il provoquait cette erreur.

Probablement une erreur de débutant, mais cela impliquait de parcourir CHAQUE objet et de vérifier les liaisons et je suis tombé sur ceci un .

6
user445658

Pour éviter toute sorte de problème de liaison, vous pouvez convertir la NSManagedObject en NSDictionary en remplissant les contrôleurs avec: [object dictionaryWithValuesForKeys:[[object entity] attributeKeys]], il est beaucoup plus facile de se connecter et de déboguer :-)

Merci pour le pointeur en passant!

3
Daniele Bernardini

J'ai rencontré cette erreur lorsque j'ai essayé d'implémenter une liaison maître-détail. Quelque chose d'analogue à département/employé. J'ai essayé de lier un arrayController à "selection.employees" du département et j'ai obtenu:

- [employé copyWithZone:]: sélecteur non reconnu envoyé à l'instance

En fin de compte, la relation entre les employés n'était pas définie sur plusieurs, comme prévu, mais sur un. Une fois que j'ai corrigé cela, tout allait bien.

1
Elise van Looij

Accidentellement confronté à ce problème.

Après une petite enquête, j'ai découvert que l'option de liaison au cacao définie sur un objet NSTextField-cell était incorrecte.

 enter image description here

 enter image description here

Le problème a été résolu en désactivant la liaison.

0
Astoria

J'ai également eu un problème similaire et provenait de l'appel d'un objet ProxyObject plutôt que de l'objet réel d'un contrôleur de tableau.

Par exemple:

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

mais

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

Je l'ai eu lorsque j'ai renvoyé une vue de la fonction NSTableViewDataSource-tableView:objectValueForTableColumn:row:. Au lieu de cela, il est supposé renvoyer une valeur (par exemple NSString*). (Pas étonnant compte tenu de son nom, mais l'erreur n'est pas utile pour découvrir cela. La fonction à laquelle je pensais est -tableView:viewForTableColumn:row: dans NSTableViewDelegate.)

0
prewett