Ho un funzionamento NSCollectionView
con un'eccezione minore, ma critica. Ottenere ed evidenziare l'oggetto selezionato all'interno della raccolta.Evidenziazione selezione in NSCollectionView
Ho avuto tutto questo lavoro prima di Snow Leopard, ma qualcosa sembra essere cambiato e non riesco a mettere il dito su di esso, così ho preso il mio NSCollectionView
di nuovo ad un test di base e ho seguito la documentazione di Apple per la creazione di un NSCollectionView qui:
vista la collezione funziona bene seguendo la guida di avvio rapido. Tuttavia, questa guida non discute la selezione diversa da "There are such features as incorporating image views, setting objects as selectable or not selectable and changing colors if they are selected"
.
Usando questo come esempio sono andato alla fase successiva di legare il controller di array al NSCollectionView
con il tasto di controllo selectionIndexes
, pensando che questo avrebbe associare qualsiasi scelta che faccio tra il NSCollectionView
e il controller di array e quindi sparando un Notifica KVO. Ho anche impostato il NSCollectionView
per essere selezionabile in IB.
Sembra che non ci sia delegato di selezione per NSCollectionView
e, a differenza della maggior parte delle visualizzazioni di Cocoa UI, non sembra esserci un'evidenziazione selezionata di default.
Quindi il mio problema si riduce a un problema correlato, ma due domande distinte.
- Come posso acquisire una selezione di un articolo?
- Come visualizzare un evidenziamento di un articolo?
NSCollectionView
's guide di programmazione sembrano essere pochi e rari e la maggior parte le ricerche tramite Google sembrano tirare su pre-neve implementazioni Leopard, oppure utilizzare la visualizzazione in un file XIB separato.
Per quest'ultimo (file XIB separato per la vista), non vedo perché questo dovrebbe essere un prerequisito altrimenti avrei sospettato che Apple non avrebbe incluso la vista nello stesso pacchetto della vista di raccolta articolo.
So che questo sarà un problema "non vedo il bosco per gli alberi" - quindi sono preparato per il "doh!" momento.
Come al solito, tutti e tutti gli aiuti molto apprezzati.
Update 1
OK, così ho pensato di trovare l'elemento selezionato (s), ma non hanno ancora capire l'evidenziazione.Per gli interessati sul calcolare gli elementi selezionati (supponendo che si sta seguendo la guida di Apple):
Nel controllore (nel mio caso di test App Delegato) ho aggiunto il seguente:
In awakeFromNib
[personArrayController addObserver:self
forKeyPath:@"selectionIndexes"
options:NSKeyValueObservingOptionNew
context:nil];
Nuovo metodo
-(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
}
}
}
Non dimenticare di dealloc per i non-GC
-(void)dealloc
{
[personArrayController removeObserver:self
forKeyPath:@"selectionIndexes"];
[super dealloc];
}
Ancora alla ricerca per la risoluzione clou ...
Update 2
accolse il consiglio di Macatomy ma aveva ancora un problema. Pubblicare i metodi di classe pertinenti per vedere dove ho sbagliato.
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, decisamente un "Doh!" momento di leggere la tua soluzione, ma dopo aver provato il tuo suggerimento non ha avuto fortuna - il che suggerisce che forse ho un problema con il mio PrototypeView. Posso catturare l'evento di selezione con il KVO, quindi so che collectionView (e successivamente il controller di array) sta selezionando la selezione - e posso interrogare l'oggetto del modello selezionato, ma non ottengo il richiamo di 'setSelected'. 'selected' restituisce false ogni volta. Qualche idea? Pubblicherò le lezioni se ciò sarebbe di aiuto. – Hooligancat
Assicurarsi che in Interface Builder l'elemento della vista raccolta e la vista prototipo abbiano l'identità della classe impostata sulla sottoclasse corretta anziché solo su NSCollectionViewItem e NSView predefiniti. Se hai fatto questo, allora sì, pubblicare le lezioni sarebbe utile :) – indragie
Sono un idiota. Ho dimenticato di impostare la classe identificata per CollectionViewItem in IB ... – Hooligancat