TabView -selectTabViewItemAtIndex funktioniert nur in awakeFromNib

  • das laufzeitverhalten, das sich unter Instruments beobachten lässt, scheint sich dadurch, dass ich nun diese Zeile in die Klassenmethode "sharedController" aufgenommen habe, nicht zu verändern.

    allerdings muss ich auch zugeben, dass ich ISController im nib instanziert habe. bitte nicht schlagen- aber: was soll und kann ich jetzt tun. Wo liegt der strukturelle fehler?

    Vielen Dank,

    MPB
  • Original von major_pb
    das laufzeitverhalten, das sich unter Instruments beobachten lässt, scheint sich dadurch, dass ich nun diese Zeile in die Klassenmethode "sharedController" aufgenommen habe, nicht zu verändern.

    allerdings muss ich auch zugeben, dass ich ISController im nib instanziert habe. bitte nicht schlagen- aber: was soll und kann ich jetzt tun. Wo liegt der strukturelle fehler?

    Ein Objekt im nib existiert schon und wird beim Laden nur "aufgeweckt", deswegen 'awakeFromNib'. Ein 'alloc/init' wird nicht mehr aufgerufen.
    Du hast also Deinen ISController doppelt, wenn ich das richtig sehe, einmal aus dem nib, und einmal aus Deiner Klassenmethode. Welchen möchtest Du?
    I would be embarrassed if they did not spy on me.
  • Original von major_pb
    klarerweise den aus dem nib. aber wie krieg ich den denn im code?

    Ganz verstehe ich die Frage nicht. Eigentlich hast Du ihn doch schon.
    Vielleicht fehlt Dir nur eine Instanzvariabel.

    Mit 'awakeFromNib' greifst Du jedenfalls darauf zu, das ist doch im Code.
    I would be embarrassed if they did not spy on me.
  • Vielleicht würde etwas Lektüre Dir hier mehr helfen. Du kämpfst hier mit einem grundsätzlichen Problem: Wo (und wie) soll eine zentrale Variable vorgehalten werden?
    Das hängt vor allem damit zusammen, was Du vorhast, ist also eine Entscheidung im Design.

    Soweit ich es sehe, kannst Du zumindest Deine Klassenmethode erst einmal knicken, das ist hier nicht angemessen.
    I would be embarrassed if they did not spy on me.
  • ich seh das genau so wie longW

    das singelton was du da versucht hast zu erzeugen ist völlig fehl am platz

    der kontrolfluß ist typischerweise bei einem Programm wie deinem das du:

    Nib -> instanziert controller -> instanziert/lädt/whatever alle weiteren klassen

    diesem muster folgst.

    dein kontroller merkt sich dann ja auch entsprechend welche instanzen er schon erzeugt hat
    snafu
    :() { :|: &};:
    sometimes i dream in hex
    Obey gravity! Because its a law!
  • Moment. Das heißt also ich mache den Main-Controller zu einer Instanz im Nib und der Controller lädt mit awakeFromNib oder sonstirgendwas die anderen Controller? Und wie kann ich dann beispielsweise auf das Interface zugreifen, wenn nicht über den Main-Controller im Nib? Also irgendwie glaub ich habe ich da was konzeptionell nicht ganz verstanden...
  • Original von major_pb
    Moment. Das heißt also ich mache den Main-Controller zu einer Instanz im Nib und der Controller lädt mit awakeFromNib oder sonstirgendwas die anderen Controller? Und wie kann ich dann beispielsweise auf das Interface zugreifen, wenn nicht über den Main-Controller im Nib? Also irgendwie glaub ich habe ich da was konzeptionell nicht ganz verstanden...


    Die 'nib'-Datei wird geladen, entweder automatisch oder per Aufruf, ansonsten nicht irgend etwas, und jedes zu ladende Objekt bekommt ein 'awakeFromNib' gesendet.

    Der bequemste Zugriff ist über Instanzvariablen, ein e besondere Rolle hat 'filesOwner'.

    Wie schon mehrmals gesagt, da hilft eigentlich nur Lesen, oder jemandem über die Schulter gucken.
    I would be embarrassed if they did not spy on me.
  • Nicht alles, was in einem Nib-File zu sehen ist, ist auch eine Instanz. Der "File's Owner" und "First Responder" sind "Platzhalter".
    Als File's Owner wird in der Regel die Klasse definiert, deren Instanz dieses Nib lädt, in der Regel bezeichnet man diesen als "Controller" und erstellt ihn aus einer Subclass von NSObject.

    Du hast eigentlich nur zwei Möglichkeiten, mehrere Controller miteinander bekannt zu machen.
    1) via Outlets im Nib, wenn Du nur 1 Nib hast (selten). Die Instanzierung der Controller erfolgt dann durch das öffnen des Nibs.
    2) via Erzeugen der Controller-Instanzen über Code und speichern der Zeiger zu diesen Controllern in Instanzvariablen. Schau Dir mal das Application-Delegate einer mit Xcode neu erzeugten Cocoa-App an. Dort siehst Du, wie das gemacht werden kann.

    Ein möglicher Weg:
    NSApplication gibt es im Programm nur 1 x.
    Das Application-Delegate gibt's auch nur 1 x (weil es nur im MainMenu.nib instanziert wird)
    Stell Dir vor, das Delegate kennt alle "wichtigen" Controller, weil es Zeiger zu von ihm erzeugten Controllern in Instanzvariablen speichert.
    Du kannst VON ÜBERALL im Code das Application Delegate ansprechen, via [NSApp delegate], also kannst Du so auch alle dort "bekannten" Controller erreichen, z. B. via [[NSApp delegate] nameDesZeigersAufDeineControllerinstanz]. So kannst Du über das AppDelegate zwei Controller miteinander kommunizieren lassen, die selber den Weg zum jeweils anderen nicht kennen.

    No.