Pregunta

¿Es posible pasar el puntero a un objeto en una operación de arrastrar y soltar?

Aquí está el panorama ...

Tengo una 'NSArray' de objetos personalizados. Para bien de los argumentos que vamos a decir que esto es una lista de objetos persona.

La lista está ligado a un NSTableView a través de un NSArrayController. El NSTableView es una fuente de arrastrar y tengo una NSView como un destino de arrastre.

En la aplicación de arrastrar y soltar que puedo conseguir fácilmente el nombre de la persona seleccionada (s) de la NSArrayController como NSString en el proceso de arrastrar y pasarlo al receptor en el NSView.

Sin embargo, me gustaría ser capaz de pasar un puntero al objeto persona por lo que el receptor tiene acceso a todo el objeto.

El problema parece ser que la operación de arrastre crea una nueva instancia de un objeto persona y no hace referencia al objeto persona seleccionada a pesar de la aplicación de los métodos requeridos en el modelo de persona. Como resultado consigo un objeto persona en el destino, simplemente no se rellena con los datos del objeto.

Me idealmente Quiero el puntero del objeto porque el NSView hará uso de la referencia de objeto con el fin de que todas las actualizaciones del propio objeto se reflejan tanto en el NSView y la NSTableView (y en todas partes se utiliza el objeto).

¿Es incluso posible utilizar la referencia al objeto en una operación de arrastrar y soltar o tengo que pasar algún tipo de referencia a medida que es una Ivar del objeto persona y luego hacer una búsqueda, una vez que llegue a su destino? (Esto podría parecer un poco arcaica a mí teniendo en cuenta cómo tiene mucho objeto hacer referencia Obj-C).

Yo entiendo que un objetivo podría aceptar una operación de arrastre desde fuera de la aplicación, pero que especifica la operación como una operación local daría cuenta de que esto no es así?

He comprobado los documentos de manzana, pero aún no parecen ser capaces de encontrar una respuesta.

Arrastrar y soltar programación Temas

de cartón de la Guía de programación

Todas y cada una ayuda muy apreciada.

¿Fue útil?

Solución

Una mesa de trabajo es sólo un contenedor de datos de diferentes tipos, así que lo que se pone en la mesa de trabajo debe ser convertibles a datos de algún tipo.

Lo que necesita es dar a cada persona un identificador de objeto de algún tipo y poner eso en la mesa de trabajo bajo un identificador de tipo personalizado de su propia invención. Generalmente, un identificador tal debe ser el identificador de paquete de la aplicación (que debe ser el inverso de su nombre de dominio, además de su nombre-por ejemplo, aplicación, com.example.surfwriter) más el nombre del tipo (por ejemplo, com.example.surfwriter .tabstop).

Cuando se recibe una gota, la verificación de este tipo. Si está presente, mirar hacia arriba el objeto correcto y hacer lo que se supone que con ella. Un arrastre desde la vista de tabla a la misma vista tabla debe implementar esta moviendo o copiando el objeto a una nueva fila.

No utilizar la dirección del objeto-es decir., El objeto en sí, como su identificador. Si las matrices de objetos (por ejemplo, se borran), la dirección ya no será válida, o puede referirse a un objeto diferente (que puede o no ser de la misma clase que el objeto original). Utilizar algo que se puede mirar hacia arriba y con seguridad no pueda encontrar. Esto se aplica a cortar / copiar y pegar más que arrastra, pero se puede y se debe manejar tanto con más o menos el mismo código.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top