Frage

Ich habe erstellt erfolgreich eine NSCollectionView und hinzugefügt Objekt ein Etikett zu der Ansicht Prototyp in IB, gebunden an eine Eigenschaft meiner vertreten. Ich möchte jetzt programmatisch eine NSButton und NSTextField mit dem NSTextField auf eine Eigenschaft meiner dargestellte Objekt gebunden erstellen. Wenn die Schaltfläche geklickt wird Ich möchte die NSTextField ein- und ausblenden.

Das Problem, das mir begegnet ist, wenn ich für meine Kontrollen nach Ansicht der initWithCoder Methode meiner Initialisierungscode setzen und die Bindung in der awakeFromNib Auffassung ist die Bindung nicht zu verkabeln. Wenn ich die Initialisierung für meine Kontrollen im awakeFromNib setzen, wenn die Schaltfläche geklickt wird, ich habe keinen Zugang zu den Kontrollen in meiner Ansicht (sie sind null, wenn ausgedruckt mit NSLog).

Von dem, was ich kann sagen, es sieht aus wie das Problem sein kann, dass die Art und Weise NSCollectionView funktioniert, ist es eine Instanz der Ansicht erstellt, kopiert es, wie alle viele Objekte in der Sammlung Ansicht. Wie erhalte ich die die Tasten zu initialisieren und der Bindung mit der Kopie des Prototyps zu arbeiten?

Unten ist mein Code für die Initialisierung und meine im awakeFromNib für meine Unterklasse Ansicht Bindung:

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
War es hilfreich?

Lösung

Das klingt ähnlich wie etwas, was ich gerade tat, vielleicht ist es das, was Sie brauchen.

NSCollectionView und Überschreibung:

- (NSCollectionViewItem *)newItemForRepresentedObject:(id)object

In newItemForRepresentedObject:, retreive die Ansicht Artikel, dann Steuerelemente hinzufügen und keine programmatische Bindungen:

@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

Hoffentlich ist das irgendwo in der Nähe, wo Sie sein müssen ...

Andere Tipps

-awakeFromNib ist nicht auf der Ansicht für eine NSCollectionViewItem aufgerufen, wenn diese Ansicht in der gleichen Feder wie die NSCollectionView ist, aber es wird aufgerufen, wenn Sie die Ansicht in einem separaten Spitze setzen.

  • Erstellen Sie eine leere nib-Datei (BlahBlahCollectionViewItem.nib).
  • Schneiden Sie die Ansicht Auflistelement aus, was auch immer nib Sie haben es in
  • Fügen Sie ihn in die neue NIB-Datei
  • Ändern Sie die Klasse seines Besitzers NSCollectionViewItem.
  • Schließen Sie die Ansicht Steckdose an den Eigentümer der neu eingefügten Ansicht
  • Öffnen Sie die nib-Datei mit dem NSViewController
  • Wählen Sie die dazugehörigen NSViewControllerItem
  • Ändern Sie den Nib Name-Eigenschaft auf den Namen der neuen Spitze
  • Halten Sie den Code in -awakeFromNib

-awakeFromNib ist nicht für die Ansichten vom Prototyp NSCollectionViewItem kopiert genannt. Setzen Sie Ihren verbindlichen Code in initWithCoder: und Sie sollten in Ordnung sein.

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