Tengo un NSCollectionView
que funciona con una excepción menor, pero crítica. Obtener y resaltar el elemento seleccionado dentro de la colección.Resaltado de selección en NSCollectionView
He tenido todo esto funcionando antes de Snow Leopard, pero parece que algo ha cambiado y no puedo ubicarlo, así que tomé mi NSCollectionView
de vuelta a una prueba básica y seguí la documentación de Apple para la creación de un NSCollectionView aquí:
ver la colección funciona bien siguiendo la guía de inicio rápido. Sin embargo, esta guía no analiza la selección que no sea "There are such features as incorporating image views, setting objects as selectable or not selectable and changing colors if they are selected"
.
Usando esto como un ejemplo fui a la siguiente etapa de unir el controlador de matrices a la NSCollectionView
con la clave de controlador selectionIndexes
, pensando que esto obligaría a cualquier selección hago entre el NSCollectionView
y el controlador de matriz y por lo tanto disparando una Notificación KVO. También configuré el NSCollectionView
para que se pueda seleccionar en IB.
Parece que no hay un delegado de selección para NSCollectionView
y, a diferencia de la mayoría de las vistas de la interfaz de usuario de Cocoa, parece que no hay ningún resaltado seleccionado por defecto.
Así que mi problema realmente se reduce a un problema relacionado, pero hay dos preguntas distintas.
- ¿Cómo puedo capturar una selección de un artículo?
- ¿Cómo se muestra el resaltado de un elemento?
NSCollectionView
's guías de programación parecen ser pocos y distantes entre sí y la mayoría de las búsquedas a través de Google aparecerá para levantar implementaciones Leopard pre-nieve, o utilizar la vista en un archivo separado XI ter.
Para este último (archivo XIB separado para la vista), no veo por qué esto debería ser un requisito previo de lo contrario habría sospechado que Apple no habría incluido la vista en el mismo paquete que la vista de colección ít.
Sé que esto va a ser un problema de "no puedo ver la madera por los árboles", así que estoy preparado para el "¡do!" momento.
Como siempre, cualquier y toda ayuda fue muy apreciada.
Actualización 1
bien, así que pensé encontrar el artículo (s) seleccionado, pero todavía tienen que calcular el resaltado.Para los interesados en averiguar los elementos seleccionados (si se asume que está siguiendo la guía de Apple):
En el controlador (en mi caso de prueba de la aplicación Delegado) he añadido lo siguiente:
En awakeFromNib
[personArrayController addObserver:self
forKeyPath:@"selectionIndexes"
options:NSKeyValueObservingOptionNew
context:nil];
Nuevo método
-(void)observeValueForKeyPath:(NSString *)keyPath
ofObject:(id)object
change:(NSDictionary *)change
context:(void *)context
{
if([keyPath isEqualTo:@"selectionIndexes"])
{
if([[personArrayController selectedObjects] count] > 0)
{
if ([[personArrayController selectedObjects] count] == 1)
{
personModel * pm = (PersonModel *)
[[personArrayController selectedObjects] objectAtIndex:0];
NSLog(@"Only 1 selected: %@", [pm name]);
}
else
{
// More than one selected - iterate if need be
}
}
}
No se olvide de dealloc para los no-GC
-(void)dealloc
{
[personArrayController removeObserver:self
forKeyPath:@"selectionIndexes"];
[super dealloc];
}
Sigue búsqueda de la solución más destacado ...
Actualización 2
siguió el consejo de Macatomy pero todavía tenía un problema. Publicando los métodos de clase relevantes para ver dónde me he equivocado.
MyView.h
#import <Cocoa/Cocoa.h>
@interface MyView : NSView {
BOOL selected;
}
@property (readwrite) BOOL selected;
@end
MyView.m
#import "MyView.h"
@implementation MyView
@synthesize selected;
-(id)initWithFrame:(NSRect)frame {
self = [super initWithFrame:frame];
if (self) {
// Initialization code here.
}
return self;
}
-(void)drawRect:(NSRect)dirtyRect
{
NSRect outerFrame = NSMakeRect(0, 0, 143, 104);
NSRect selectedFrame = NSInsetRect(outerFrame, 2, 2);
if (selected)
[[NSColor yellowColor] set];
else
[[NSColor redColor] set];
[NSBezierPath strokeRect:selectedFrame];
}
@end
MyCollectionViewItem.h
#import <Cocoa/Cocoa.h>
@class MyView;
@interface MyCollectionViewItem : NSCollectionViewItem {
}
@end
"MyCollection ViewItem.m *
#import "MyCollectionViewItem.h"
#import "MyView.h"
@implementation MyCollectionViewItem
-(void)setSelected:(BOOL)flag
{
[(MyView *)[self view] setSelected:flag];
[(MyView *)[self view] setNeedsDisplay:YES];
}
@end
Macatomy, definitivamente un "Doh!" momento de leer su solución, pero después de intentar su sugerencia no tuvo suerte, lo que sugiere que tal vez tenga un problema con mi PrototypeView. Puedo capturar el evento de selección con el KVO, así que sé que collectionView (y, posteriormente, el controlador de array) está seleccionando la selección, y puedo consultar el objeto del modelo seleccionado, pero no estoy llamando a 'setSelected'. 'selected' devuelve false cada vez. ¿Alguna idea? Publicaré las clases si eso ayuda. – Hooligancat
Asegúrese de que en Interface Builder su elemento de vista de colección y la vista de prototipo tengan su identidad de clase establecida en la subclase adecuada en lugar de solo el NSCollectionViewItem y NSView predeterminados. Si has hecho esto, entonces sí, publicar las clases sería útil :) – indragie
Soy un idiota. Olvidé establecer la clase identificada para CollectionViewItem en IB ... – Hooligancat