NSBrowser regiert nicht auf Methoden wenn er über eine Xib/Nib geladen wird

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

  • NSBrowser regiert nicht auf Methoden wenn er über eine Xib/Nib geladen wird

    Hi,
    ich versuch mich gerade an einem Finder ähnlichen Browser.
    Dazu habe ich in einem NSSplitView links ein NSOutlineView (Source List) als Sidebar platziert und rechts einen den View leer gelassen um verschiedenen ContentViews darzustellen.
    In den leeren View wird unteranderem ein NSBrowser geladen. Der NSBrowser ist in einer eigenen XIB platziert die dann über einen NSViewController in den rechten NSSplitView der MainMenu.xib geladen wird.
    Das klappt soweit alles und der NSBrowser zeigt alle Dateien sauber an, die unter dem Pfad der Delegate Methode (id)rootItemForBrowser:(NSBrowser *)browser zu finden sein sollen.

    Wenn ich jetzt aber in der SIdebar ein Item anklicke, das zu einem anderen Pfad führen soll, regiert der NSBrowser nicht und zeigt den vorherigen Pfad weiter an.
    Die [browser loadColumnZero] Methode bewirkt nichts. Egal mit welcher Methode ich den NSBrowser aus der Class Reference anspreche er reagiert nicht.
    Nur die Delegate Methoden funktionieren.

    Ich habe testweise den NSBrowser direkt in den NSSplitView der MainMenu.xib gesetzt und da funktioniert alles wie es soll.
    Wieso reagiert der NSBrowser nicht wenn er über einen NSViewController geladen wird?
    Gruss zuko
  • Also der NSBrowser ist einmal als Outlet und als Delegate verbunden. Im Code habe ich den Browser an verschiedenen Stellen über NSLog abgefragt.

    Die Console gibt folgendes aus:
    Nur einmal übernimmt der Outlet den Delegat Browser (Zeile 6) in der awakeFromNib Methode ansonsten gibt der Outlet Browser (null) wieder.
    In der .h ist der Outlet Browser als @property (weak, nonatomic) definiert. Eine Änderung in (strong) ändert nichts.

    Quellcode

    1. 2014-10-18 12:37:20.453 _BROWSER[1656:303] init
    2. 2014-10-18 12:37:20.457 _BROWSER[1656:303] (null) browser (OutLet) awakeFromNib
    3. 2014-10-18 12:37:20.471 _BROWSER[1656:303] (null) browser (OutLet) awakeFromNib
    4. 2014-10-18 12:37:20.584 _BROWSER[1656:303] (null) browser (OutLet) awakeFromNib
    5. 2014-10-18 12:37:20.602 _BROWSER[1656:303] init
    6. 2014-10-18 12:37:20.603 _BROWSER[1656:303] <NSBrowser: 0x100205360> browser (OutLet) awakeFromNib
    7. 2014-10-18 12:37:20.604 _BROWSER[1656:303] <NSBrowser: 0x100205360> browser (Delegate) rootItemForBrowser
    8. 2014-10-18 12:37:20.612 _BROWSER[1656:303] <NSBrowser: 0x100205360> browser (Delegate) objectValueForItem
    9. 2014-10-18 12:37:20.622 _BROWSER[1656:303] <NSBrowser: 0x100205360> browser (Delegate) objectValueForItem
    10. 2014-10-18 12:37:20.624 _BROWSER[1656:303] <NSBrowser: 0x100205360> browser (Delegate) objectValueForItem
    11. 2014-10-18 12:37:20.626 _BROWSER[1656:303] <NSBrowser: 0x100205360> browser (Delegate) objectValueForItem
    12. 2014-10-18 12:37:20.627 _BROWSER[1656:303] <NSBrowser: 0x100205360> browser (Delegate) objectValueForItem
    13. 2014-10-18 12:37:20.628 _BROWSER[1656:303] <NSBrowser: 0x100205360> browser (Delegate) objectValueForItem
    14. 2014-10-18 12:37:20.629 _BROWSER[1656:303] <NSBrowser: 0x100205360> browser (Delegate) objectValueForItem
    15. 2014-10-18 12:37:20.631 _BROWSER[1656:303] <NSBrowser: 0x100205360> browser (Delegate) objectValueForItem
    16. 2014-10-18 12:37:20.632 _BROWSER[1656:303] <NSBrowser: 0x100205360> browser (Delegate) objectValueForItem
    17. 2014-10-18 12:37:20.696 _BROWSER[1656:303] applicationDidFinishLaunching
    18. 2014-10-18 12:37:20.701 _BROWSER[1656:303] (null) browser (OutLet) awakeFromNib
    19. 2014-10-18 12:37:20.716 _BROWSER[1656:303] (null) browser (OutLet) awakeFromNib
    20. 2014-10-18 12:37:20.721 _BROWSER[1656:303] (null) browser (OutLet) awakeFromNib
    21. 2014-10-18 12:37:20.874 _BROWSER[1656:303] <NSBrowser: 0x100205360> browser (Delegate) objectValueForItem
    22. 2014-10-18 12:37:20.875 _BROWSER[1656:303] <NSBrowser: 0x100205360> browser (Delegate) objectValueForItem
    23. 2014-10-18 12:37:20.875 _BROWSER[1656:303] <NSBrowser: 0x100205360> browser (Delegate) objectValueForItem
    24. 2014-10-18 12:37:20.876 _BROWSER[1656:303] <NSBrowser: 0x100205360> browser (Delegate) objectValueForItem
    25. (...)
    26. 2014-10-18 12:37:21.017 _BROWSER[1656:303] <NSBrowser: 0x100205360> browser (Delegate) objectValueForItem
    27. 2014-10-18 12:37:21.018 _BROWSER[1656:303] <NSBrowser: 0x100205360> browser (Delegate) objectValueForItem
    28. 2014-10-18 12:37:21.019 _BROWSER[1656:303] <NSBrowser: 0x100205360> browser (Delegate) objectValueForItem
    29. 2014-10-18 12:37:35.270 _BROWSER[1656:303] (null) browser (Outlet) button Click
    Alles anzeigen
    Gruss zuko
  • Hast Du vielleicht ein Outlet für den NSBrowser in deinem MainMain.XIB definiert und erwartest, dass das auch gesetzt wird, wenn Du den mittels eines anderen XIBs lädst? Das wird nicht funktionieren.

    Ansonsten schaut's so aus, als ob der NSBrowser null ist, Du also die geladene Instanz nicht Deiner Instanzvariablen zuweist. Schau' halt mal wie vorgeschlagen im Debugger nach. Dann hat das Raten ein Ende.

    schönen Gruß

    gandhi
  • Hallo,

    Was für neue Erkenntnisse soll der Debugger bringen?

    Jede Menge… ;)

    Setze einen Breakpoint an einer Stelle und hovere dann mit der Maus über der Variable.
    Dann siehst Du deren Inhalt.

    Das Tolle dadran ist, dass das zum angehaltenen Zeitpunkt auch bei anderen Variablen funktioniert.

    Das spart unmengen NSLog() und wenn man sich an den Debugger mal gewöhnt hat, dann will man nichts anderes mehr.
    Einfach mal probieren - kostet ja nix…

    Viele Grüße
  • Du erzeugst mehrere Instanzen von deinem AppDelegate. Die Instanz, die den NSBrowser kennt ist nicht die, die Du im MainMenu.xib als "echtes" NSApplicationDelegate setzt. Bei der ist die Verbindung zum NSBrowser nicht da, nur bei der die Du in ColumnView.xib hast. Die sprichst Du aber logischerweise nie an.

    Das würde man gut im Debugger sehen, wenn man mal einen Breakpoint in awakeFromNib der Klasse "AppDelegate" setzt. Das beantwortet auch Deine Frage nach der Nützlichkeit des Debuggers

    schönen Gruß

    gandhi
  • Die awakeFromNib Methode wird insgesamt 7 mal aufgerufen und dabei werden genau 2 Instanzen vom AppDelegate erzeugt.
    Beim 4ten Aufruf wird die 2te AppDelegate Instanz erzeugt, die den NSBrowser erkennt. Beim 5ten Aufruf wird wieder die erste Instanz angesprochen.

    Ok die Erkenntnis hat der Debugger gebracht.

    Warum oder Wodurch wird überhaupt eine 2te Instanz des AppDelegate erzeugt, die dann später nicht die ist die angesprochen wird?
    Oder die Frage in simple: Wie sieht die Lösung aus?
    Gruss zuko
  • zuko schrieb:


    Warum oder Wodurch wird überhaupt eine 2te Instanz des AppDelegate erzeugt, die dann später nicht die ist die angesprochen wird?


    Ja weil Du das in zwei NIBs instanziierst, warum denn sonst?

    Oder die Frage in simple: Wie sieht die Lösung aus?


    Einen App-Delegate verwenden oder den NSBrowser anders an den nötigen Stellen bekannt machen.

    schönen Gruß

    gandhi
  • Ok, mir war nicht bewusst das durch ein AppDelegate Objekt in beiden NIBs zwei Instanzen erzeugt werden. Ich nahm an, so wird das selbe Objekt angesprochen.
    Da sind ein paar Wissenslücken in Bezug auf Instanzierung von Objekten.

    Ich hab es mittlerweile schon so gelöst das alle Views in der Main.xib platziert und durch ein- und ausblenden aufgerufen werden anstatt durch verschiedene NIBs geladen zu werden.
    Trotz allem würde mich die Lösung über verschiedene NIBs interessieren.

    Nehmen wir an ich würde ein browserObjekt (.h/.m) für die NIB mit dem NSBrowser erzeugen, dort das Outlet anlegen und als Delegate/ DataSource für den NSBrowser bestimmen,
    dann würde doch durch das Laden über den NSViewController in die Main.xib das browserObjekt instanzieret werden. Wie spreche ich dieses Objekt aus der AppDelegate dann an?

    Wie instanziert man Objekte in verschiedenen NIBs, die in einem Objekt angesprochen werden sollen?
    Gruss zuko
  • Also ein Weg die Objekte in verschiedenen xibs anzusprechen ist für jede xib eine NSViewController Class zu erstellen und diese als File's Owner in der entsprechenden xib zu definieren.
    Alle Objekte, die angesprochen werden sollen, werden dann in der xib mit dem File's Owner verbunden.

    In dem Objekt, das die verschiedenen Objekte in der Xib ansprechen soll, instanziert man die eigens erstellte NSViewController Class mit der Methode:
    MyViewController = [[MyViewController alloc] initWithNibName:@"MyXib" bundle:nil];

    Die Sichtbarkeit der xib wird dann über die NSView Methoden erledigt.

    SourceView Apple Sample Code
    Gruss zuko