Pergunta

Eu tenho um NSCollectionView e a visualização é um NSBox com uma etiqueta e um nsbutton. Quero um clique duplo ou um clique do nsbutton para dizer ao controlador para executar uma ação com o objeto representado do NSCOLLECTIONVIEWIVEM. A visualização do item está subclassificada, o código é o seguinte:

#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

O problema que encontrei é que, como uma ibação, as únicas coisas no escopo do -start são as coisas que foram vinculadas no IB, então delegar e visualizar. Isso significa que não posso obter o objeto representado para enviá -lo para o delegado.

Existe uma maneira de contornar esse escopo limitado ou uma maneira melhor ou se apossar do objeto representado?

Obrigado.

Foi útil?

Solução

Em primeiro lugar, você quase nunca precisa subclasse vistas.

Bind não faz o que você pensa - você deseja AddObServer: Forkeypath: Opções: Contexto: (você deve tentar entender o que é para Tho).

Quando você diz "A chave parece ser a visualização" protótipo "para um NSCOLLECTIONVIEWIVEM", acho que você está realmente confuso ...

Esqueça o iboutlet & ibaction - eles não significam nada se você não for um construtor de interface. "Protótipo" não significa nada no Objective-C.

Os dois métodos na visão não têm escopo diferente de forma alguma - não há diferença entre eles. Ambos são métodos, equivalentes em todos os aspectos, além de seus nomes (e, claro, o código que eles contêm).

Se o wizarditem for nulo em -start, mas tem um valor em -Mousedown, isso tem a ver com o tempo que eles são chamados. Você tem um objeto que está desaparecendo muito cedo ou ainda não é criado em um ponto que acha que é.

Você está familiarizado com o nszombie? Você achará muito útil.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top