Frage zur Hauptmenü-Gestaltung mit OutlineView

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • NSRect frameRect = [placeHolder frame];
    [viewFromNibB setFrame:frameRect];
    [[placeHolder superview] addSubview:viewFromNibB];
    [placeHolder removeFromSuperview];

    funktioniert (natürlich...). DANKE.
    Ich bin allerdings verwundert, daß ich trotz intensiver Suche nirgendwo in der Doku oder Beispielen im Netz drauf gestoßen bin.

    Kleine Frage muß ich nachschieben:
    Mit [placeHolder removeFromSuperview] verliere ich ja meinen Platzhalter. Will ich einen anderen View reinsetzen, oder den selben View nach Entfernen wieder reinsetzen, startet der Debugger. Code:
    - (IBAction)entladen:(id)sender
    {
    [ViewAusNIbB removeFromSuperview];
    }

    - (IBAction)laden:(id)sender
    {
    NSRect frameRect = [ViewAusNIbA frame]; // Größe des ViewAusNIbB-Platzhalters
    [ViewAusNIbB setFrame:frameRect]; // ViewAusNIbB auf diese Dim./Pos. setzen
    [[ViewAusNIbA superview] addSubview: ViewAusNIbB]; // ViewAusNIbA auf CustomView setzen
    [ViewAusNIbA removeFromSuperview]; // ViewAusNIbA vom Superview entfernen

    Lasse ich [ViewAusNIbA removeFromSuperview] weg, kann ich den ViewAusNIbB problemlos raus- und reinsetzen. Spricht da was dagegen?

    Doku - interessant...:
    When considering memory management, the view hierarchy should be thought of as any other Cocoa collection object. When an item is added to a collection, it is retained. When it is removed, it is released.
    Specifically, when you insert a view as a subview using the addSubview: or addSubview:positioned:relativeTo: methods, it is retained by the receiving view. Inversely, when you remove a subview from a view hierarchy by sending its superview a removeFromSuperview message, the view is released. The replaceSubview:with: method acts the same, releasing the view that is replaced and retaining the view that is inserted in its place.

    Bin mal gespannt, ob mit replaceSubview:with: mein Outlet erhalten bleibt. Dann hüpf ich einfach von View zu View... (?)

    No.
    (nach wie vor fasziniert, wie wenig Code man braucht :))
  • Du wirst keine Doku dazu gefunden haben, weil es entweder zu abwegig oder zu nahe liegend ist. ;) Nein, mal ernsthaft. Es kommt vergleichsweise selten vor, dass man zur Laufzeit an der View-Struktur herumfuhrwerkt. Es gibt ja noch andere Möglichkeiten zum Umschalten, insbesondere Tab-Views, wie ja auch im Buch beschrieben wird. Das klappt freilich nur innerhalb eines Nibs.

    Ich würde den Placeholder keinesfalls drin lassen, weil er dann in der Hierarchie ist, wo er nichts mehr zu suchen hat. So etwas gibt früher oder später Probleme.

    Er wird ja gelöscht, da der Superview den Placeholder ein release schickt. Damit gibt es zwei Wege aus dem Dilemma:

    a) Du machst den eingefügten View zu deinem neuen Placeholder. Da du ja die Werte übernommen hast, hier insbesondere das Frame und den Superview, ändert sich dadurch nichts. Spätestens dann, wenn du aber Werte übernehmen willst, die du bei einzelnen Views anders setzt, gibt das ne Keilerei.

    b) Du retainst den Placeholder selbst. Mach dir also eine Instanzvariable und entsprechende Setter dafür. Beim awakeFromNib setzt du den einfach in der Instanzvariable. Dadurch erhält er ein Retain. Alle Eigenschaften mit Ausnahme des Superviews (den kannst du immer gefahrlos lesen, weil sich der nie ändern wird) holst du dann aus der Instanzvariable.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Alle Eigenschaften mit Ausnahme des Superviews (den kannst du immer gefahrlos lesen, weil sich der nie ändern wird) holst du dann aus der Instanzvariable.

    Kleiner Hinweis:

    Quellcode

    1. [meinView superview]
    ist nil, wenn meinView nicht in der Hierarchie sitzt.
    W.
    I would be embarrassed if they did not spy on me.
  • Original von norbi
    funktioniert (natürlich...). DANKE.
    Ich bin allerdings verwundert, daß ich trotz intensiver Suche nirgendwo in der Doku oder Beispielen im Netz drauf gestoßen bin.

    Vermutlich hast Du es in der Doku gefunden, aber nur nicht als das Gesuchte erkannt, denn das hier scheinst Du ja gefunden zu haben. Was wir hier machen ist nichts anderes, als mit der Viewhierachie zu arbeiten.

    Original von norbi
    Kleine Frage muß ich nachschieben:
    Mit [placeHolder removeFromSuperview] verliere ich ja meinen Platzhalter. Will ich einen anderen View reinsetzen, oder den selben View nach Entfernen wieder reinsetzen, startet der Debugger.

    Das ist logisch, denn es wird ja nichts in den Platzhalter eingesetzt, sondern der Platzhalter wird ersetzt. Nach dem Ersetzen gibt es den Platzhalter dann natürlich nicht mehr.

    Original von norbi
    Lasse ich [ViewAusNIbA removeFromSuperview] weg, kann ich den ViewAusNIbB problemlos raus- und reinsetzen. Spricht da was dagegen?

    Eigentlich nicht, aber ich persönlich würde es nicht so machen, weil dann ja zwei Views übereinander liegen, wovon der eine vollkommen nutzlos ist. Ich würde dann eher den Platzhalter umtaufen und als ContainerView benutzen, d.h. den ContainerView als Superview für den View aus Nib B benutzen.

    Quellcode

    1. NSRect frameRect = [containerView frame];
    2. [viewFromNibB setFrameOrigin:NSZeroPoint];
    3. [viewFromNibB setFrameSize:frameRect.size];
    4. [containerView addSubview:viewFromNibB];
    Michael