NSWindow - seltsames Verhalten

  • NSWindow - seltsames Verhalten

    Hallo,


    Ich habe ein Menu-Item in einer Methode in der Datei MenuHandler.h erstellen lassen;

    Quellcode

    1. // Edit-List-Button
    2. newItem = [[NSMenuItem allocWithZone:[NSMenu menuZone]]
    3. initWithTitle:@"Preferences"
    4. action:@selector(showWindow:)
    5. keyEquivalent:@""];
    6. [menu addItem:newItem];
    7. [newItem setEnabled:YES];



    In der Datei Preferences.h ist nun die "showWindow:" Methode definiert, auf die das Menu-Item verweist;


    Quellcode

    1. - (void)showWindow:(id)sender
    2. {
    3. [NSApp activateIgnoringOtherApps:YES];
    4. [mainWindow makeKeyAndOrderFront:self];
    5. }



    mainWindow ist per IB mit dem Fenster verbunden.




    Nun kann ich mir folgendes Verhalten nicht erklären;

    Wenn das Fenster, dass aufgerufen werden soll nicht sichtbar ist, dann ist der Button "Preferences" ausgegraut.
    Selbst wenn das Fenster zwar existiert, aber hinter einem anderen Fenster versteckt ist, ist dieser Button ausgegraut.

    Er lässt sich lediglich betätigen, wenn das Fenster im Vordergrund ist...
    (und dann passiert auch das, was in der Methode "showWindow" definiert ist.


    kann mir hier jemand erklären warum das so ist?


    P.S.: hab schon verschiedene Optionen im IB ausprobiert, was leider keine Wirkung hatte (Release when closed, deferred, one shot ...)
  • RE: NSWindow - seltsames Verhalten

    Da hast Du ein Problem mit der 'responder chain'. Entweder Du löst es, oder setzt Du Deinem Item explizit ein 'target'-Objekt, damit es beim 'validate~' aktiviert wird.
    I would be embarrassed if they did not spy on me.
  • Hallo,

    Hast du einführende Literatur gelesen?

    Auch wenn ich noch nicht so lange dabei bin frage ich mich das auch des öfteren.
    Parley scheint das nicht zu berücksichtigen ;)

    Zu Deinem "newItem":
    Es ist schön, dass das Item eine Methode "showWindow" bekommt.
    Die Frage ist nur, wo sich diese befindet. Woher soll es das selbst wissen?

    Doku sagt:

    Quellcode

    1. [newItem setTarget:self]; //... oder sonst wo.


    [newItem setEnabled:YES];

    Halte ich dafür überflüssig, da dies selbst geschieht wenn eine gültige Verbindung vorhanden ist.

    Ich kann nur nochmals Amins Anliegen bestärken. Solltest Du wirklich tun (tun sagt man nicht, wie man selbst ;)

    Viele Grüße
  • RE: NSWindow - seltsames Verhalten

    Original von Amin Negm-Awad
    Hast du einführende Literatur gelesen?



    Ja.

    "Programming in Objective-C" - von Kochan
    und
    "Cocoa Programming für Mac OS X" von Hillegass



    Es wäre halt nett ein wenig theoretisch Dinge zu erläutern die mir anscheinend fehlen - oder wenigstens Quellen zu nennen wo ich was nachlesen kann...

    Denn diese Hinweise helfen mir leider gar nicht.
  • Original von little_pixel
    Zu Deinem "newItem":
    Es ist schön, dass das Item eine Methode "showWindow" bekommt.
    Die Frage ist nur, wo sich diese befindet. Woher soll es das selbst wissen?

    Doku sagt:

    Quellcode

    1. [newItem setTarget:self]; //... oder sonst wo.




    genau das wär super wenn mir das mal einer erklärt.

    Die Methode ist in Preferences.m definiert.
    Wie setze ich nun das Target dahin?
  • Wo wird den "newItem" erzeugt?
    An der gleichen Stelle, bei der auch die Zielmethode liegt? Dann ist es self.

    Liegt die Zielmethode bei einem anderen Objekt (Klasse, die diese bereitstellt), dann ist es diese Zielinstanz.

    Ich kann das nicht so gut in Wort fassen.
    Teste doch jetzt einfach damit rum. Dann wird Dir der Sinn schon klar (oder es macht Sinn :D , gibt Sinn :D )

    Viele Grüße
  • Original von little_pixel
    Ich habe ein Menu-Item in einer Methode in der Datei MenuHandler.h erstellen lassen

    Das habe ich soeben erst realisiert. In der *.h?
    Mir scheint, als wäre Dir die Funktion der *.h und *.m nicht klar.
    Bitte nochmals lesen.

    Viele Grüße


    ui, nein - sorry, vertippt.


    Also; ich bin ja echt vielleicht etwas langsam, oder verstehe diesen objektorientierten Ansatz noch nicht;


    Aber vielleicht hilft mir noch mal einer bei meinem Denkfehler;



    Ich habe eine Datei Preferences.h und Preferences.m

    Dann habe ich eine Datei Menuhandler.h und Menuhandler.m

    Darüber hinaus eine Datei AppController.h und AppController.m



    In der AppController.m ist eine awakeNib Funktion definiert.

    Darin wird nun eine Instanz (?) des Objekts Menuhandler erzeugt.
    Diese benutz dann die Methode "mach mir ein MenuItem".

    Das MenuItem soll wiederum beim Ausführen auf die Methode "öffne Fenster" von Preferences.m zeigen.


    Mein erster Versuch war eine Instanz des Objekts "Preferences" in der Methode "mach mir ein MenuItem" zu erzeugen, welche wiederum auf die Methode "öffne Fenster" zeigt.



    Quellcode

    1. Preferences *test;
    2. test = [[Preferences alloc] init];
    3. // Edit-List-Button
    4. newItem = [[NSMenuItem allocWithZone:[NSMenu menuZone]]
    5. initWithTitle:@"Preferences"
    6. action:@selector(showWindow:)
    7. keyEquivalent:@""];
    8. [menu addItem:newItem];
    9. [newItem setEnabled:YES];
    10. [newItem setTarget:test];
    Alles anzeigen



    aber so funktioniert es nicht.


    Es wär super, wenn mir da bei diesem spezifischen Sache nochmal theoretisch unter die Arme greifen kann.