(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:
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.
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%.
Les objets Core-Data ne peuvent pas implémenter copyWithZone: - cela provoque le crash
Lorsqu'une table est remplie à l'aide de Bindings, elle tente de copier le values des objets dans NSArrayController pour rendre chaque colonne.
... 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.
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.
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 .
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!
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.
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;
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
.)