Domanda

Ho creato con successo un NSCollectionView e ho aggiunto un'etichetta al prototipo della vista in IB, associato a una proprietà del mio oggetto rappresentato. Ora voglio creare a livello di codice un NSButton e NSTextField con NSTextField associato a una proprietà del mio oggetto rappresentato. Quando si fa clic sul pulsante, voglio mostrare e nascondere NSTextField.

Il problema che ho riscontrato è se ho inserito il mio codice di inizializzazione per i miei controlli nel metodo initWithCoder della vista e l'associazione in awakeFromNib della vista, l'associazione non viene agganciata. Se inserisco l'inizializzazione per i miei controlli in awakeFromNib, quando si fa clic sul pulsante, non ho accesso ai controlli nella mia vista (sono nulli quando stampati usando NSLog).

Da quello che posso dire sembra che il problema sia che il modo in cui funziona NSCollectionView crea un'istanza della vista, quindi la copia per quanti oggetti si trovano nella vista raccolta. Come ottenere l'inizializzazione dei pulsanti e il binding per funzionare con la copia del prototipo?

Di seguito è riportato il mio codice di inizializzazione e la mia associazione in awakeFromNib per la mia vista in sottoclasse:

SubView.h

@interface SubView : NSView {
    NSButton *button;
    NSTextField *textField;
    IBOutlet NSCollectionViewItem *item; // Connected in IB to my NSCollectionViewItem
}

- (IBAction)buttonClicked:(id)sender;

@end

SubView.m

@implementation SubView

- (id)initWithCoder:(NSCoder *)decoder
{
    id view = [super initWithCoder:decoder];

    button = [[NSButton alloc] initWithFrame:NSMakeRect(50, 95, 100, 20)];
    [button setTitle:@"Begin Editing"];
    [button setTarget:self];
    [button setAction:@selector(buttonClicked:)];
    [self addSubview:button];

    textField = [[NSTextField alloc] initWithFrame:NSMakeRect(10, 10, 100, 75)];
    [self addSubview:textField];

    return(view);
}

- (void)awakeFromNib
{   
        // Bind the textField to the representedObject's name property
        [textField bind:@"value" 
       toObject:item 
        withKeyPath:@"representedObject.name" 
        options:nil];
}

- (IBAction)buttonClicked:(id)sender
{
    [button setTitle:@"End Editing"];
    [textField setHidden:YES];
}

@end
È stato utile?

Soluzione

Sembra simile a qualcosa che ho appena fatto, quindi forse è quello che ti serve.

Sottoclasse NSCollectionView e override:

- (NSCollectionViewItem *)newItemForRepresentedObject:(id)object

In newItemForRepresentedObject: , recupera l'elemento della vista, quindi aggiungi i tuoi controlli e tutti i binding programmatici:

@implementation NSCollectionViewSubclass

- (NSCollectionViewItem *)newItemForRepresentedObject:(id)object {

    // Allow the superclass to create or copy the collection view item
    NSSCollectionViewItem *newItem = [super newItemForRepresentedObject:object];

    // Get the new item's view so you can mess with it
    NSView *itemView = [newItem view];

    //
    // add your controls to the view here, bind, etc
    //

    return newItem;
}

@end

Speriamo che questo sia un posto vicino a dove devi essere ...

Altri suggerimenti

-awakeFromNib non viene chiamato nella vista per un NSCollectionViewItem se quella vista si trova nello stesso pennino di NSCollectionView, ma viene chiamato se si inserisce la vista in un pennino separato.

  • Crea un file pennino vuoto (BlahBlahCollectionViewItem.nib).
  • Taglia la vista dell'elemento della raccolta da qualsiasi pennino ce l'hai
  • Incollalo nel nuovo file pennino
  • Cambia la classe del suo proprietario in NSCollectionViewItem.
  • Collega la presa di visualizzazione sul proprietario alla vista appena incollata
  • Apri il file pennino contenente NSViewController
  • Seleziona il NSViewControllerItem associato
  • Cambia la proprietà Nome pennino con il nome del nuovo pennino
  • Conserva il codice in -awakeFromNib

-awakeFromNib non viene chiamato per le viste copiate dal prototipo NSCollectionViewItem. Inserisci il tuo codice di associazione in initWithCoder: e dovresti andare bene.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top