cocoa - "[Something copyWithZone:]: selector no reconocido enviado a la instancia" cuando se utilizan enlaces/datos principales
core-data cocoa-bindings (8)
(preguntándome y respondiendo a mí mismo porque pasé horas en la web buscando esto, y la mayoría de los recursos dicen "lo resolví al final" sin dar una explicación)
Tenía una aplicación muy simple de Core Data + Bindings:
- Un NSArrayController sacando elementos de Core Data
- Un NSTableView representándolos
- Otro NSTableView que al hacer clic en una fila en la primera tabla, muestra los detalles de ese elemento
El artículo 3 anterior causaba la falla de la aplicación, con el error:
[(my NSManagedObject) copyWithZone:]: unrecognized selector sent to instance
Implementando ese método (!) Y poniendo un punto de quiebre allí, descubrí que estaba siendo invocado por la clase NSCell de Apple; esto no ayudó mucho :(.
Como una pista para evitar cualquier tipo de problema con el enlace, se puede convertir el NSManagedObject
en NSDictionary
mientras se completan los controladores con: [object dictionaryWithValuesForKeys:[[object entity] attributeKeys]]
, es mucho más fácil conectarse y depurar :-)
Gracias por el puntero, por cierto!
Encontré este error cuando traté de implementar un enlace maestro-detalle. Algo análogo al Departamento / Empleado. Intenté vincular un arrayController a "selection.employees" del Departamento y obtuve:
- [Empleado copyWithZone:]: selector no reconocido enviado a la instancia
Resultó que la relación de los empleados no estaba establecida en muchos, como se esperaba, sino en uno. Una vez que corregí esto, todo estaba bien.
Gracias por esta solución, me dirigió en la dirección correcta. Para aquellos de ustedes que están aprendiendo InterfaceBuilder espero que esta información adicional les ayude.
Al construir un tutorial, ArrayController.ObjectValue
involuntariamente una Text field Cell - Text Cell
a mi ArrayController.ObjectValue
.
Se suponía que el enlace real sucedería en
Table Column > Table Cell View > Static Text - Table View Cell
Ese fue correcto, pero visualmente en el árbol debajo de él (por razones que aún no entiendo, IB necesita una Text Field Cell
). También había vinculado:
Table Column > Text Field Cell - Text Cell
Fue ese segundo enlace que al tratar de copiar el objeto completo porque la ruta era objectValue
sin clave, estaba desencadenando este error.
Probablemente fue un error de principiante, pero significó caminar a través de CADA objeto y buscar enlaces y me encontré con este.
Resulta que TODO lo anterior es necesario para activar esto, y XCode le permite hacer algo que está mal en el 99.9% de las situaciones, sino en el 100%.
Los objetos Core-Data no pueden implementar copyWithZone: - esto causa el bloqueo
Cuando una tabla vista se rellena con enlaces, intenta copiar los valores de los objetos en NSArrayController para representar cada columna
... pero si no especifica el enlace de Columna por completo (Xcode le permite especificarlo a medias), entonces tableview intenta la "copia" en los objetos en lugar de sus valores
El error en mis enlaces: había especificado que una columna de tabla tenía un "valor" con:
Controlador Key = "arrangedObjects" Model Key Path = (en blanco)
(Esto es un error en autocompletar XCode4 - borrará el campo ModelKeyPath a veces cuando tabula demasiado rápido)
Termine de escribir el enlace, por ejemplo:
Modelo Key Path = "valor"
... y todo funciona de nuevo.
También me gustaría publicar aquí porque tuve un problema similar con el mismo tipo de cosas
objeto definido vacío:
Codigo erroneo:
@property (nonatomic, copy, readwrite) MSender * sender;
esto debería resolver un error de compilación porque con el recuento de referencias Xcode no tiene idea de cómo copiar mi objeto. En cambio, falla en tiempo de ejecución ...
Escribir código:
@property (nonatomic, strong, readwrite) MSender * sender;
Espero que ayude a alguien.
También tuve un problema similar y procedía de llamar a un ProxyObject en lugar de llamar al objeto real desde un controlador de array.
Por ejemplo:
MYEntity *entity = EntityController.selection;
NSString *property = entity.property; // <--- causes the error
pero
MYEntity *entity = EntityController.selectedObjects firstObject]; // <--- fixes the error
NSString *property = entity.property;
NSTableViewDataSource
esto cuando devolvió una vista desde la función -tableView:objectValueForTableColumn:row:
En cambio, se supone que devuelve un valor (por ejemplo, NSString*
). (No es sorprendente dado su nombre, pero el error no es útil para descubrir esto. La función en la que estaba pensando es -tableView:viewForTableColumn:row:
en NSTableViewDelegate
).