Frage

Ich möchte in der Ansicht für mein NSCollectionViewItem eine eigene Kontrolle bringen.

Lets sagen, ich habe eine benutzerdefinierte NSView genannt BoxesView.BoxesView ist nur eine Ansicht, die eine vorgegebene Anzahl von Boxen in seiner Ansicht zieht. Diese Zahl der Boxen ist in der init-Methode festgelegt. Lets sagen, dass ich es auf 8 gesetzt.

Wenn ich die Sammlung Ansicht laden, werden alle anderen Kontrollen in der Ansicht funktionieren, (Tasten, Schieber, etc.), aber meiner Meinung nach nicht ziehen.

Wenn ich einen Haltepunkt in der drawRect Methode von BoxesView eingestellt zeigt, dass die Anzahl der Boxen zu zeichnen 0! Wenn ich einen Haltepunkt in meiner Init-Methode festgelegt, wo ich numBoxes auf 8 gesetzt, zeigt es, dass numBoxes nicht tatsächlich bis 8. Auch fertig, die init-Methode nur 1 Mal aufgerufen wird, obwohl es mehrere Zeilen in der Sammlung Ansicht sind.

Was mache ich falsch?

UPDATE

Ich konnte diese Funktion erhalten, indem die itemPrototype zu Last von einem xib Einstellung statt in der gleichen xib als NSCollectionViewItem des Sein. Das ist großartig, außer es funktioniert nur auf 10,6 und nicht 10,5.

UPDATE 2

Was ich versuche zu tun, ist meine benutzerdefinierte Ansicht in der Ansicht bleiben, dass bereits für die NSCollectionViewItem existiert, die bereits vorhanden ist. Was passiert, ist die Membervariable mBoxWidth wird weggeblasen und ist Null, so, wenn es um es zu zeichnen geht, passiert nichts.

@implementation DumbView

- (id)initWithFrame:(NSRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
       mBoxWidth = 3;
    }
    return self;
}

- (void)drawRect:(NSRect)dirtyRect {
   NSRect bounds = self.bounds;
   [[NSColor redColor]set];
   [NSBezierPath fillRect:NSMakeRect(bounds.origin.x, bounds.origin.y, mBoxWidth, mBoxWidth)];
}

@end

War es hilfreich?

Lösung

Ich habe nicht initWithCoder implementieren. Das behebt alles.

Andere Tipps

NSCollectionViewItem verwendet einen Prototyp Ansicht, die dupliziert und für jedes Element in der Sammlung der dargestellten Objekte verdrahtet.

Sie könnte gehen durch alle die Mühe, einen IBPlugin für die benutzerdefinierte Ansicht zu machen (eine, die die numberOfBoxesToDraw Bindung macht), aber das ist ein Schmerz in den Arsch und es gibt einen einfacheren Weg: manuelle Bindungen.

Manuelle Bindungen mit NSCollectionView / Item

Als erstes subclcass NSCollectionViewItem, IB sagen, diese neue Unterklasse zu verwenden, und stellen Sie sicher, dass eine Steckdose in ihm (wie boxView), die zu Ihrer benutzerdefinierten Ansicht verbunden ist.

Als nächstes Unterklasse NSCollectionView (Set IB diese Unterklasse verwenden) und überschreibt - newItemForRepresentedObject: . Darin rufe Sie erste Super (das Ergebnis einer lokalen Variablen zu speichern), dann von Hand binden Ihre „boxView“ 's Anzahl der Boxen auf dem dargestellten Objekt mit dem ‚numberOfBoxes‘ Schlüssel Sie in Ihrem Modell.

Haben Sie versucht, copyWithZone Überlastung?

Ich vermute, Ihr Artikel wird kopiert zu werden und nicht direkt init'd.

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