cocoa macos nspasteboard

cocoa - NSPasteboard y datos personalizados simples.



macos (1)

Hay dos formas de usar NSPasteboard.

La forma más antigua: coloca los datos en la pizarra tú mismo.

Primero, debe declarar los tipos que colocará en la mesa de trabajo . También designas un objeto que será "propietario" del tablero de pegado, lo que significa que este es el objeto que pone cosas en el tablero de pegado.

El siguiente paso es poner los datos en la mesa de trabajo. Este paso es opcional.

“¿Opcional ?!”, preguntas. Sí: si no coloca los datos en el área de pegado de ningún tipo que haya declarado, y la mesa de pegar posteriormente los necesita (para pegarlos / soltarlos), entonces el tablero de pegas le pedirá a usted (el propietario) . Esto se llama prometer esos datos, y es bueno cuando los datos son costosos para copiar (grandes) o generar.

Hay cinco formas de poner cosas en la mesa de trabajo (además de que se las pidan):

  • Como una cuerda. Sólo bueno para texto plano. La mesa de trabajo se encargará de convertirlo a varias codificaciones según sea necesario.
  • Como una lista de propiedades. Solo es bueno para las listas de propiedades (y sí, esto se aplica hasta el final, por lo que una serie de imágenes no cuenta), o cosas que puede convertir ay desde listas de propiedades. Esto puede incluir sus propios objetos, si implementa eso en ellos.
  • Como datos en bruto. Adecuado para los tipos de datos existentes, como los tipos de imágenes (PNG, JPEG, etc.) y los tipos de A / V (MPEG-4, etc.).
  • Como el contenido de un archivo identificado por ruta. Solo está bien si lo que estás arrastrando / copiando ya es un archivo.
  • Como el contenido de un contenedor de archivos. Si aún no está utilizando envoltorios de archivos, puede ignorar esto de manera segura.

La forma más nueva: coloque objetos en el tablero y permita que se conviertan en datos.

El nuevo hotness, introducido en Snow Leopard, es hacer que sus propios objetos puedan escribirse en una mesa de trabajo. Esto requiere que ellos sepan todo sobre ellos mismos que usted querrá en la mesa de trabajo, incluidos los identificadores.

NSPasteboardWriting hacer que sus objetos se ajusten tanto a NSPasteboardWriting como a NSPasteboardReading .

El protocolo de escritura se verá realmente familiar ahora que conoces la forma más antigua. La mesa de trabajo le pregunta a su objeto qué tipos se representaría a sí mismo y luego le pide un objeto de lista de propiedades para cada tipo . (El protocolo también proporciona una forma de prometer tipos en lugar de solicitar que los datos para ellos se soliciten de inmediato).

Para copiar los objetos que se ajustan a NSPasteboardWriting en la mesa de trabajo, envíe un mensaje clearContents a la clearContents (requerido en la nueva forma, opcional en la forma antigua), luego writeObjects: pasando una matriz de los objetos que desea copiar.

El protocolo de lectura es, como cabría esperar, el inverso. Para pegar, le envías a la readObjectsForClasses:options: trabajo un readObjectsForClasses:options: La mesa de trabajo le pregunta a cada una de esas clases qué tipos reconocería , y luego (opcionalmente) intenta crear una instancia de una o más de las que están en la mesa de trabajo .

La desventaja de esto, especialmente cuando se trata de identificadores de reutilización, es que puede terminar rompiendo la separación de la capa del modelo de la capa del controlador. El inicializador de lectura deberá saber qué hacer con un identificador si desea que devuelva el objeto existente que tiene ese identificador. Eso significa que necesita hablar con el controlador (incorrecto) o duplicar el código de búsqueda del controlador (peor).

No conozco una buena forma de implementar el movimiento de arrastrar y soltar (incluido, entre otros, reordenar) con los nuevos protocolos sin tener que enfrentar este problema. Para la copia de arrastrar y soltar (incluido, entre otros, el proceso cruzado), está bien, ya que no necesita identificadores para eso, solo genere los datos en un extremo y cree la nueva copia en el otro. .

La ventaja de la nueva forma es que el manejo de múltiples elementos es mucho más sensato. En la forma más antigua, solo hay un "elemento", de hecho, no es en realidad ningún concepto de elementos, en varios tipos. Si quería copiar o arrastrar varias cosas, creó una matriz y la copió como una sola lista de propiedades para algún tipo y luego volvió a crear / recuperar las múltiples cosas de esa lista de propiedades en el otro extremo. La forma más nueva admite explícitamente uno o más elementos; al copiar varias cosas, simplemente se las pasa a writeObjects:

Su caso: un solo identificador NSUInteger

Póngalo en un NSNumber (que es una lista de propiedades) y utilícelo de la manera más antigua.

Me está costando mucho intentar que NSPasteboard funcione, así que perdóname por mi falta de comprensión.

Todo lo que quiero es una forma sencilla de escribir y recuperar del área de trabajo un valor NSUInteger que sea solo para mi aplicación. Todo lo que estoy haciendo es arrastrar y soltar un elemento dentro de mi aplicación, por lo que todo lo que necesito en la mesa de trabajo es la identificación del elemento.

He intentado buscar en NSPasteboardItemDataProvider y NSPasteboardItem, y NSData, pero todos tienen una forma compleja de hacer algo tan simple. De hecho, no tengo idea de cuál es la forma correcta de hacer algo tan simple: cada muestra parece tratar con el tipo de cadena, o algo mucho más complicado. El selector [NSMutable SetData] tampoco parece existir aunque no haya advertencias en el código.

Si alguien me puede orientar en la dirección correcta, estaría muy agradecido. :)

Edición: Estoy usando [dragImage ...] para ayudarme con mis operaciones de arrastre.