2010-05-18 3 views
0

J'ai un NSCollectionView et la vue est une NSBox avec un label et un NSButton. Je veux un double clic ou un clic sur le NSButton pour dire au contrôleur d'effectuer une action avec l'objet représenté de NSCollectionViewItem. Le point de vue de l'article est a été sous-classé, le code est le suivant:Déplacement IBActions portée limitée

#import <Cocoa/Cocoa.h> 
#import "WizardItem.h" 

@interface WizardItemView : NSBox { 
    id delegate; 
    IBOutlet NSCollectionViewItem * viewItem; 
    WizardItem * wizardItem; 
} 

@property(readwrite,retain) WizardItem * wizardItem; 
@property(readwrite,retain) id delegate; 

-(IBAction)start:(id)sender; 

@end 

#import "WizardItemView.h" 

@implementation WizardItemView 
@synthesize wizardItem, delegate; 

-(void)awakeFromNib { 
    [self bind:@"wizardItem" toObject:viewItem withKeyPath:@"representedObject" options:nil]; 
} 

-(void)mouseDown:(NSEvent *)event { 
    [super mouseDown:event]; 
    if([event clickCount] > 1) { 
     [delegate performAction:[wizardItem action]]; 
    } 
} 

-(IBAction)start:(id)sender { 
    [delegate performAction:[wizardItem action]]; 
} 


@end 

Le problème que j'ai rencontré est que comme IBAction, les seules choses dans le cadre de -start sont les choses qui ont été liés dans IB, alors délégué et viewItem. Cela signifie que je ne peux pas obtenir à l'objet représenté pour l'envoyer au délégué.

Y a-t-il un moyen de contourner cette portée limitée ou une meilleure façon de se procurer l'objet représenté?

Merci.

+0

Salut, j'ai du mal à comprendre votre question .. peut-être que nous pourrions le réécrire un peu et vous pouvez obtenir quelques réponses ... Quelques questions .. pourquoi sous-classe NSBox? C'est la mauvaise façon de faire les choses dans le cacao ou MVC en général. Ce code doit être dans un windowController ou un viewController. Qu'est-ce que -start:? Vous ne mentionnez pas. Aussi, je peux me tromper, mais je ne pense pas que bind: toObject: withKeyPath: fait ce que vous pensez qu'il fait. – hooleyhoop

+0

Pendant que je suis là .. Un IBAction n'est pas vraiment 'une chose'. IBAction est juste une étiquette pour Interface Builder. Une méthode appelée IBAction est juste une méthode régulière. Il n'a en aucun cas «une portée limitée». Je trouve que parler de «portée» dans l'objectif-c indique probablement une certaine confusion provenant d'une langue différente. Il est rarement utile de parler de l'objectif-c. – hooleyhoop

+0

"confusion venant d'une langue différente" - sans aucun doute;). Je pense que la portée était une façon assez décente de le décrire, mais bon. Je suis conscient IBAction est juste pour IB, mais la clé semble être la vue "prototype" pour un NSCollectionViewItem. Les deux méthodes de la vue semblent avoir une portée différente. Dans mouseDown wizardItem a une valeur, au début, c'est null. – Septih

Répondre

0

Premièrement, vous n'avez presque jamais besoin de sous-classer les vues. Bind ne fait pas ce que vous pensez - vous voulez addObserver: forKeyPath: options: context: (Vous devriez essayer de comprendre ce que -bind est pour tho).

Quand vous dites « la clé semble qu'il soit le « » vue d'un NSCollectionViewItem » prototype Je pense que vous êtes vraiment confus ...

Oubliez IBOutlet & IBAction - ils ne veulent rien dire si vous n'êtes pas Interface Builder. "Prototype" ne veut rien dire dans Objective-c.

Les deux méthodes de la vue n'ont aucune portée différente - il n'y a aucune différence entre elles. Ce sont deux méthodes, équivalentes à tous égards, à part leurs noms (et bien sûr le code qu'elles contiennent).

Si wizardItem est null dans -start mais possède une valeur dans -mouseDown, cela dépend entièrement du moment où ils sont appelés. Vous avez soit un objet qui disparaît trop tôt ou n'est pas encore créé à un moment où vous pensez que c'est.

Connaissez-vous NSZombie? Vous le trouverez très utile.

+0

Ma compréhension (nouvellement formée) est la suivante: Dans un NSCollectionView, vous avez un itemPrototype (le mot de Cocoa, pas le mien) de la classe NSCollectionViewItem. Toutes les liaisons effectuées dans IB sont correctement disponibles dans le itemPrototype mais pas dans les copies du itemPrototype faites pour chaque élément de contenu, donc oui, scope est totalement le mauvais mot, ce sont des instances totalement différentes. Ce que j'ai maintenant est une sous-classe de NSCollectionViewItem en tant que contrôleur et ceci peut voir le representatedObject parfaitement pour des pressions de bouton, etc. Cependant il ne peut pas voir la liaison de délégué. Joie... – Septih

Questions connexes