Frage

Ich erstelle eine NSCell Unterklasse, die einige Objekte direkt in die Ansicht zeichnet (unter Verwendung von drawInRect:fromRect:operation:fraction:respectFlipped:hints:) und zeichnet auch eine NSButton Instanz einfach mit NSView's addSubview: Wähler.

Während mit der ersten Methode gezeichnete Objekte alle korrekt dargestellt werden, habe ich Probleme beim Zeichnen NSButton korrekt.Das Problem ist, dass mein NSButton Instanzen werden an den richtigen Stellen gezeichnet, jedoch um ein Vielfaches.

Ich habe eine Weile im Internet recherchiert und einige Leute haben die Verwendung eines Caches vorgeschlagen, aber ich bin mir nicht sicher, ob das effizient ist.(Das Aufrufen eines Arrays mit Schaltflächen mithilfe einer for-Schleife führt definitiv zu einem langsamen Scrollen, da ich viele Daten anzeige ...)

Wie würden Sie das machen?Bin ich auf dem falschen Weg?

Dies ist der relevante Code:

- (void)drawInteriorWithFrame:(NSRect)cellFrame inView:(NSView *)controlView
{    
    NSRect _controlRect = cellFrame;

    float _Y = cellFrame.origin.y;

    NSRect _accessoryRect = NSMakeRect(_controlRect.size.width - 70.0f, _Y + 9.0f, 50.0f, 23.0f);

    _switch = [self _choiceSwitch];

    [_switch setFrame:_accessoryRect];
    [controlView addSubview:_switch];
}
War es hilfreich?

Lösung

Um es kurz zu machen: Freunde lassen keine Freunde zu addSubview, beim Zeichnen.

Dies ist eine grundlegende und nicht besonders gut erklärt Aspekt der Verwaltung von Steuerschnittstellen, es ist jedoch wichtig, sich damit auseinanderzusetzen.

Lassen Sie Ihre Controller die „Reihenfolge“ der Unteransichten bestimmen, und Sie können ruhig schlafen, da Sie wissen, dass diese Schaltfläche nicht übermäßig herumgespielt werden sollte (was NICHT der Fall ist, wenn sie in Ihren benutzerdefinierten Zeichenroutinen herumgeschubst wird).

Es ist leicht, in dieser Gasse gefangen zu sein, Denn, hey, ich habe ein hinzugefügt NSImageView in meinem initWithFrame und alles scheint in Ordnung zu sein… Aber es ist Es ist einfach irgendwie nicht so, wie man es machen soll, schätze ich ... und wenn Sie mit der Unterklassifizierung von NSControl usw. beginnen.ist, wenn einem klar wird, warum.

Aktualisiert: Hier ist eine wirklich gute Beschreibung zum Entwerfen benutzerdefinierter Steuerelemente mit einem ebenso tolles Beispielprojekt beigefügt – der die Art der Codeorganisation verkörpert, die dazu beitragen kann, diese Art von Problemen zu vermeiden.Zum Beispiel..Sie werden in der Controller-Klasse bemerken, wie er jede Schaltfläche separat, einzigartig und unabhängig von den Aufgaben anderer Ansichten hält ...

for (int butts = 0; butts < 3; butts++) {
    NSRect buttFrame = NSMakeRect(0, butts * 10, 69, 10);
    ExampleButt *butt = [[ExampleButt alloc]initWithFrame:buttFrame];
    [mainView addSubview:butt];
}

enter image description here

Andere Tipps

"Zeichnung" NSButton Es ist definitiv eine schlechte Idee, die Instanz jedes Mal zur Ansichtshierarchie hinzuzufügen, wenn Sie die Zelle selbst zeichnen.Erstellen Sie stattdessen eine NSButtonCell und konfigurieren Sie sie nach Ihrem Geschmack.Dann, in deinem -[NSCell drawInteriorWithFrame:inView:] Verwenden Sie einen Zellen-IVAR, um sein Aussehen zu zeichnen.

Wenn Sie ein anklickbares haben möchten NSButton Versuchen Sie, in jeder Zelle der Tabellenansicht eine Instanz aufzurufen addSubview: wenn möglich.Jedes Mal, wenn Sie dies tun, kann es sein, dass die Kontrollansicht ihr Layout ungültig macht und alles von Grund auf neu zeichnet, was in Ihrem Fall zu einer Art Rekursion führt.

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