Frage

ich eine NSCollectionView haben und die Aussicht ist ein NSBox mit einem Label und einem NSButton. Ich mag einen Doppelklick oder einen Klick auf dem NSButton dem Controller zu sagen, eine Aktion mit dem dargestellten Objekt des NSCollectionViewItem auszuführen. Die Item-View hat subclassed worden ist, wird der Code wie folgt:

#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

Das Problem, das ich in laufen habe ist, dass als IBAction, das einzige, was im Rahmen der -start sind die Dinge, die in IB gebunden sind, so delegieren und ViewItem. Das bedeutet, dass ich nicht bei dem dargestellten Objekt erhalten, es zu den Delegierten zu senden.

Gibt es eine Möglichkeit, um dieses begrenzten Umfang oder einen besseren Weg, oder habhaft des dargestellten Objekts?

Danke.

War es hilfreich?

Lösung

Zunächst man fast nie zu Unterklasse Ansichten benötigen.

Bind nicht tun, was Sie denken - Sie wollen addObserver: forKeyPath: Optionen: Kontext: (Sie sollten versuchen, zu verstehen, was -bind für tho ist).

Wenn Sie sagen, „der Schlüssel scheint es, das Wesen zu sein‚Prototyp‘-Ansicht für eine NSCollectionViewItem“ Ich glaube, Sie sind wirklich verwirrt ...

Vergessen IBOutlet & IBAction - sie haben nicht alles bedeuten, wenn Sie nicht Interface Builder sind. "Prototype" bedeutet nichts in Objective-c.

Die beiden Methoden in der Ansicht nicht über unterschiedlichen Umfang in keine Weise - es gibt keinen Unterschied zwischen ihnen überhaupt. Sie sind beide Methoden gleichwertig in jeder Hinsicht außer ihrem Namen (und natürlich auch den Code, den sie enthalten).

Wenn wizardItem ist null in -start aber einen Wert in -mouseDown diese vollständig mit dem Timing zu tun ist, dass sie aufgerufen werden. Sie entweder ein Objekt, das zu schnell geht weg oder noch nicht an einem Punkt, erstellt Sie denken, es ist.

Sind Sie mit NSZombie? Sie finden es sehr nützlich finden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top