À certaines occasions, ma tête me fait mal juste de la frappant contre le mur de Cacao. Aujourd'hui est un de ces jours.
J'ai un travail NSCollectionView
avec un mineur, mais critique, d'exception. Arriver et en mettant en évidence l'élément sélectionné dans la collection.
J'ai eu tout ce travail avant de Snow Leopard, mais quelque chose semble avoir changé et je n'arrive pas à mettre mon doigt sur elle, alors j'ai pris ma NSCollectionView
le droit de retour à un test de base et de suivi de la documentation d'Apple pour la création d'un NSCollectionView ici:
L'affichage de la collection des œuvres de l'amende suivant le guide de démarrage rapide. Cependant, ce guide ne traite pas de sélection autre que "There are such features as incorporating image views, setting objects as selectable or not selectable and changing colors if they are selected"
.
L'utilisation de ce comme un exemple, je suis allé à la prochaine étape de liaison Contrôleur de groupe à l' NSCollectionView
avec le contrôleur de la touche selectionIndexes
, en pensant que ce serait de lier tout sélection-je faire entre l' NSCollectionView
et le contrôleur de matrice et donc de tirer un KVO de notification. J'ai aussi mis l' NSCollectionView
pour être sélectionnable dans l'IB.
Il semble y avoir aucune sélection délégué NSCollectionView
et contrairement à la plupart de Cacao UI points de vue, il ne semble pas sélectionnée par défaut en surbrillance.
Donc mon problème vient vraiment à une question connexe, mais deux questions distinctes.
- Comment faire pour capturer une sélection d'un élément?
- Comment puis-je afficher une mise en évidence d'un élément?
NSCollectionView
's des guides de programmation semblent être très rares, et la plupart des recherches via Google semblent tirer vers le haut de pré-Snow Leopard mises en œuvre, ou de l'utilisation de la vue dans un autre fichier XIB.
Pour le second (séparée fichier XIB pour la vue), je ne vois pas pourquoi cela devrait être un pré-requis sinon je l'aurais soupçonné que Apple n'aurait pas inclus dans la vue dans le même panier que l'affichage de la collection de l'élément.
Je sais que cela va être "vous ne pouvez pas voir la forêt pour les arbres" question - donc, je suis prêt pour le "doh!" moment.
Comme d'habitude, toute aide appréciée.
Mise à jour 1
OK, j'ai donc pensé trouver l'élément sélectionné(s), mais n'ont pas encore la figure de mettre en évidence. Pour les intéressés à comprendre les éléments sélectionnés (en supposant que vous suivez la Pomme guide):
Dans le contrôleur (dans mon cas de test de l'Application Délégué), j'ai ajouté ce qui suit:
Dans awakeFromNib
[personArrayController addObserver:self
forKeyPath:@"selectionIndexes"
options:NSKeyValueObservingOptionNew
context:nil];
Nouvelle Méthode
-(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
}
}
}
N'oubliez pas de dealloc pour les non-GC
-(void)dealloc
{
[personArrayController removeObserver:self
forKeyPath:@"selectionIndexes"];
[super dealloc];
}
Toujours à la recherche pour le point culminant de la résolution...
Mise à jour 2
Pris Macatomy les conseils de mais toujours eu un problème. Affichage de la classe pertinente méthodes pour voir où je suis allé mal.
Mavue.h
#import <Cocoa/Cocoa.h>
@interface MyView : NSView {
BOOL selected;
}
@property (readwrite) BOOL selected;
@end
Mavue.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
"MyCollectionViewItem.m*
#import "MyCollectionViewItem.h"
#import "MyView.h"
@implementation MyCollectionViewItem
-(void)setSelected:(BOOL)flag
{
[(MyView *)[self view] setSelected:flag];
[(MyView *)[self view] setNeedsDisplay:YES];
}
@end