Pregunta

Tengo una visión que se usa en cada uno de los elementos de mi CollectionView. Tengo una IBOutlet a la CollectionViewItem desde mi punto de vista y tengo que conectó en el Interface Builder. Quiero tener acceso a un valor de la representedObject (que es un objeto de datos básicos) en mi código de la vista. Aquí está un ejemplo de lo que estoy tratando de hacer - acceder a un valor de secuencia de la representedObject:

En el archivo .h:

IBOutlet NSCollectionViewItem *item; // Connected in IB

En el archivo .m

NSString *seq = [[item representedObject] valueForKey:@"seq"];
NSLog(@"Seq: %@", seq); // returns Seq: (null)

Sé que la SEC está poblada porque tengo que enganchan a una etiqueta en la vista en CollectionViewItem IB utilizando la ruta de la clave representedObject.seq y que funciona.

Cualquier idea de por qué cuando intento acceder al valor de la SEC en el código para la vista que devuelve un valor nulo?

¿Fue útil?

Solución

Es muy probable que NSCollectionViewItem no copia a través de conexiones IBOutlet de ellos puntos de vista de partida para el prototipo NSCollectionViewItem. Por lo tanto, item es nula, por lo seq también será nula.

El patrón típico para acceder a la instancia NSCollectionViewItem es para enlazar con el prototipo. Usted menciona que usted hizo esto y que funciona. Eso es simplemente porque esa es la forma típica, con el apoyo de hacerlo.

Si realmente necesita una conexión directa con el tema de una manera que no pueden proporcionar fijaciones, es probable que tenga que configurarlo manualmente. Una forma de hacer esto es anular -copyWithZone: de NSCollectionViewItem, llame estupendo, a continuación, realizar la conexión manualmente.

Otros consejos

1) subclase el NSView que se utiliza para la representación un elemento de la vista de colección

2) En la presente subclase, agregar una propiedad delegado

3) Sublcass la NSCollectionViewItem

4) Reemplazar el setView: método. Añadir una línea para establecer la propiedad delegado de la vista a la instancia NSCollectionViewItem (es decir, yo).

Ahora, dentro de NSView subclase, tendrá acceso al elemento NSCollectionView correspondiente a través de la propiedad delegado (por ejemplo, se puede acceder a su representedObject).

Yo tenía el mismo problema, pero encontré una solución muy fácil: Pongo la vista en un .xib diferente y vinculado este en el NSCollectionViewItem (que es en realidad un NSViewController). Entonces el .xib será deserializar para cada celda y se establecen todos los puntos de venta.

  1. Subclase NSView.
  2. Añadir método delegado a dicha subclase ... algo así como - (void)mouseDownOnItemAtIndex:(NSUInteger)index para decirle al oyente de que el usuario hace clic en un elemento de un índice específico.
  3. Tire de la vista de colección mediante el uso de self.superview en la misma clase. Crear una variable para almacenar un NSUInteger. Almacenar el índice del elemento mediante el método [[collectionView subviews] indexOfObject:self]. Pase que el índice en el parámetro del método delegado index.
  4. La clase que cumpla con el protocolo definido en su NSView ahora será capaz de saber de eventos mousedown a una celda específica. Si desea que el representedObject de un elemento específico, simplemente llame collectionView:itemAtIndex y conseguir el artículo accediendo al mismo a través de la propiedad representedObject en NSCollectionViewItem.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top