2011-07-10 10 views
28

(preguntando y contestando a sí mismo porque pasé horas en la web buscando esto, y la mayoría de los recursos dicen "resolví" en el final", sin dar una explicación)"[something copyWithZone:]: selector no reconocido enviado a la instancia" al usar Bindings/Core Data

yo tenía una muy sencilla aplicación Core Data + Bindings:

  • un NSArrayController tirando objetos de datos básicos
  • un NSTableView ellos renderizado
  • Otro NSTableView que cuando cl ick en una fila de la primera tabla, muestra los detalles de ese elemento

artículo 3 anterior estaba causando caída de aplicación, con el error: (!)

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

de ejecución de dicho método y poner un punto de interrupción allí, descubrí que estaba siendo invocado por la clase NSCell de Apple; esto no ayudó mucho :(.

Respuesta

23

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%. objetos

  1. Core-Data no puede aplicar copyWithZone: - esto hace que el accidente

  2. Cuando un tableview se llena mediante enlaces, que trata de copiar los valores de los objetos en el NSArrayController a render cada Columna

  3. ... pero si no puede especificar la unión de Columna por completo (Xcode le permite especificarla a medias), entonces la tabla intenta la "copia" en los objetos en lugar de sus valores

El error en mis fijaciones: me había especificado que una columna de tabla tenía un "valor" con:

Controller Key = "arrangedObjects" Model Key Path = (blank)

(esto es un error en XCode4 autocompletar - se eliminará el campo ModelKeyPath veces cuando salta demasiado rápido)

terminar de escribir en la unión, por ejemplo:

Model Key Path = "value"

... y todo funciona de nuevo.

+0

Parece que a veces Interface Builder no guarda automáticamente los cambios cuando se encuentra en un campo de texto en el inspector y pulsa ejecutar. El campo (por ejemplo, Ruta de clave de modelo) * aparece * para establecerse cuando en realidad no es así. – fzwo

6

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 ayude.

Resulta que mientras construía un tutorial, había vinculado involuntariamente un Text field Cell - Text Cell a mi ArrayController.ObjectValue.
se suponía que la verdadera unión a suceder en

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

que uno era correcto, pero visualmente en el árbol por debajo de ella (por razones que no entiendo todavía IB necesita un Text Field Cell.) Tenía también obligado:

Table Column > Text Field Cell - Text Cell

fue que la segunda unión que tratar de copiar el objeto entero porque el camino era objectValue sin llave, que era tri detectando este error.

Probablemente un error novato, pero significó caminar a través de CADA objeto y buscar enlaces y encontré este uno.

+0

Error de principiante ... pero la idea de un constructor de IU visual es facilitar las cosas, no más ... gracias por describir, resultó que estaba cometiendo el mismo error –

8

también me gustaría publicar aquí porque tenía un problema similar con el mismo tipo de cosas

vacío de objetos definidos:

código incorrecto:

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

esto debe trow una compilación error porque con el recuento de referencias Xcode no tiene idea de cómo copiar mi objeto. En su lugar se produce un error en tiempo de ejecución ...

Escribir código:

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

espero que ayude a alguien.

+0

Saludos, esto resolvió el error que había estado viendo ¡¡por un día!! :)) – stan4th

+0

Saludos :-D ¡Resolvió mi problema también! – Daneo

+0

BIG MINUS. Esto no funcionaría en algunos casos. Al menos en mi caso, aparece cuando trato de guardar un objeto que se crea en contexto hijo liberado automáticamente en dicha variable (no probé el contexto principal porque parece funcionar solo en el hilo principal). De todos modos parece la siguiente situación: a través de un tiempo este objeto se vuelve nulo. – Gargo

3

como una sugerencia para evitar cualquier tipo de problemas con la unión se puede convertir el NSManagedObject en NSDictionary al rellenar los controladores con: [object dictionaryWithValuesForKeys:[[object entity] attributeKeys]], es mucho más fácil de conectar y depuración :-)

Gracias por la puntero por cierto!

0

También tuve un problema similar y procedía de llamar a un ProxyObject en lugar de al objeto real de 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; 
0

enfrentaron accidentalmente con este tema.

Después de una pequeña investigación descubrí que la razón era la opción de unión de cacao incorrecta establecida en el objeto NSTextField -cell.

enter image description here

enter image description here

El problema se resolvió por el interruptor de la unión fuera.

0

Lo tengo cuando devolvió una vista de la función NSTableViewDataSource-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.)

0

Encontré este error cuando traté de implementar un enlace maestro-detalle. Algo análogo al Departamento/Empleado. Traté de enlazar un arrayController a "selection.employees" del Departamento y tengo:

-[Employee copyWithZone:]: unrecognized selector sent to instance

apagó la relación de los empleados no se ajusta a-muchos, como estaba previsto, pero a uno. Una vez que corregí esto, todo estaba bien.

Cuestiones relacionadas