Notification/Delegate, wenn sich Modfier ändern?

  • RE: Notification/Delegate, wenn sich Modfier ändern?

    Original von below
    Original von MCDan
    Also mir ist nur die Methode:

    Quellcode

    1. - (void)flagsChanged:(NSEvent *)theEvent
    von NSResponder bekannt. Die verwende ich und damit klappt es sehr gut.


    Die muss dann aber in der Responder Chain sein? Ich habe jetzt einen Button gesubclassed, aber der reagiert da irgendwie nicht drauf.

    Jepp.

    Hm, ich verwende eine Subclass von NSWindow für meine Document Windows und darin wird die o.a. Methode entsprechend aufgerufen.

    Wo möchtest Du den modifier change denn verarbeiten?
  • Mein Button soll anders reagieren, wenn Du "Option" drückst. Das soll der User natürlich wissen, also soll auch die Anzeige des Buttons sich ändern, wenn Option gedrückt ist.

    Und, da ich ja nichts einfach machen kann, soll das in eine PrefPane passieren. Subclassing von NSWindow hat da (offenbar?) nix gebracht.

    Und NSPreferencePane ist kein Responder.

    Gruss

    Alex
    The only thing that really worried me was the ether.
  • Original von below
    Mein Button soll anders reagieren, wenn Du "Option" drückst. Das soll der User natürlich wissen, also soll auch die Anzeige des Buttons sich ändern, wenn Option gedrückt ist.

    Und, da ich ja nichts einfach machen kann, soll das in eine PrefPane passieren. Subclassing von NSWindow hat da (offenbar?) nix gebracht.

    Und NSPreferencePane ist kein Responder.


    Hm, Deine NSPreferencePane Subclass hat doch ein mainView, in der auch der Button als Subview liegt. Da die responder chain durch die superviews geht, sollte sie entsprechend auch im mainView ankommen. Wenn Du also als mainView eine Subclass von NSView verwendest, dann solltest dort flagsChanged: aufgerufen werden.
  • Ja, aber wenn ich das richtig sehe wird der Main View als NSView von den System Preferences angelegt.

    Aber selbst in einer einfachen Cocoa Anwedung bekommt meine NSWindow subclass keine events. Ich muss nochmal kucken, ob das Ding "firstResponder" wird.

    Alex
    The only thing that really worried me was the ether.
  • Original von below
    Ja, aber wenn ich das richtig sehe wird der Main View als NSView von den System Preferences angelegt.

    Aber selbst in einer einfachen Cocoa Anwedung bekommt meine NSWindow subclass keine events. Ich muss nochmal kucken, ob das Ding "firstResponder" wird.

    Aber Du musst doch einen View haben in welchem Deine ganzen Controlls liegen. Wenn Du für diesen View eine Subclass verwendest, sollte dort flagsChanged: aufgerufen werden.

    In einer Subclass von NSWindow sollte die Methode flagsChanged: auf alle Fälle aufgerufen werden, wenn sie nicht vorher in der responder chain verarbeitet wird.

    Hier mal eine kleine Testapp zum Ausprobieren.
  • Danke, aber hier zeige ich Dir mal mein Problem, das hier ist die Responder Chain angefangen von [[[self mainView] window] firstResponder]:

    Quellcode

    1. Responder: <NSTextView: 0x377380> (details) of class NSTextView
    2. Responder: <_NSKeyboardFocusClipView: 0x387470> of class _NSKeyboardFocusClipView
    3. Responder: <NSPrefSearchField: 0x37cd20> of class NSPrefSearchField
    4. Responder: <<NSToolbarItemViewer: 0x37f140>: 'com.apple.prefpane.search'> of class NSToolbarItemViewer
    5. Responder: <_NSToolbarViewClipView: 0x378c90> of class _NSToolbarViewClipView
    6. Responder: (<NSToolbarView: 0x377ab0>: com.apple.SystemPrefsToolbar) of class NSToolbarView
    7. Responder: <NSThemeFrame: 0x375ae0> of class NSThemeFrame
    8. Responder: <NSPrefWindow: 0x3757f0> of class NSPrefWindow
    9. Responder: <PreferencesApp: 0x316380> of class PreferencesApp


    Wie Du sehen kannst, ist das Fenster eine NSPrefWindow, da kann ich im IB Custom Classes setzten bis ich grün anlaufe. Offenbar ziehen die Sys Prefs die einzelnen Elemente aus dem NIB (Wo sie in einer NSWindow liegen), und packen sie dann auf die NSPrefWindow.

    Ideen?

    Alex
    The only thing that really worried me was the ether.
  • Original von below
    Danke, aber hier zeige ich Dir mal mein Problem, das hier ist die Responder Chain angefangen von [[[self mainView] window] firstResponder]:

    Quellcode

    1. Responder: <NSTextView: 0x377380> (details) of class NSTextView
    2. Responder: <_NSKeyboardFocusClipView: 0x387470> of class _NSKeyboardFocusClipView
    3. Responder: <NSPrefSearchField: 0x37cd20> of class NSPrefSearchField
    4. Responder: <<NSToolbarItemViewer: 0x37f140>: 'com.apple.prefpane.search'> of class NSToolbarItemViewer
    5. Responder: <_NSToolbarViewClipView: 0x378c90> of class _NSToolbarViewClipView
    6. Responder: (<NSToolbarView: 0x377ab0>: com.apple.SystemPrefsToolbar) of class NSToolbarView
    7. Responder: <NSThemeFrame: 0x375ae0> of class NSThemeFrame
    8. Responder: <NSPrefWindow: 0x3757f0> of class NSPrefWindow
    9. Responder: <PreferencesApp: 0x316380> of class PreferencesApp


    Wie Du sehen kannst, ist das Fenster eine NSPrefWindow, da kann ich im IB Custom Classes setzten bis ich grün anlaufe. Offenbar ziehen die Sys Prefs die einzelnen Elemente aus dem NIB (Wo sie in einer NSWindow liegen), und packen sie dann auf die NSPrefWindow.

    Ideen?

    Du musst ja nicht eine Subclass von NSWindow verwenden. Eine Subclass von NSView tut es ja auch, zumindest bei mir. =)

    Es ist bei einer PreferencePane jedoch nicht ganz einfach den "mainView" zum firstResponder zu machen, da dies direkt in didSelect anscheinend nicht funktioniert. Ich weiss nicht, ob die u.a. Lösung in allen OS X Version funktioniert.

    Hier mal eine Testapp als PreferencePane. In der Methode flagsChanged: wird ein beep ausgegeben, damit man erkennt, dass diese aufgerufen wird. Die Methode wird natürlich nicht aufgerufen wenn z.B. das PrefSearchField der firstResponder ist.
  • OK, soweit, so klappt.

    Jetzt kommt das nächste Problem:

    User drückt und hält Option, ich verändere die Anzeige.

    Jetzt macht der User mit der immer noch gedrückten Option Taste einen Klick in ein anderes Program. Ich bekomme keine "flagsChanged" Message, und wenn der User die Taste wieder los lässt bekomme ich auch keine mehr.

    Ideen?

    Alex
    The only thing that really worried me was the ether.
  • Original von below
    OK, soweit, so klappt.

    Jetzt kommt das nächste Problem:

    User drückt und hält Option, ich verändere die Anzeige.

    Jetzt macht der User mit der immer noch gedrückten Option Taste einen Klick in ein anderes Program. Ich bekomme keine "flagsChanged" Message, und wenn der User die Taste wieder los lässt bekomme ich auch keine mehr.

    Ideen?

    Na ja, wenn der User jetzt noch erwartet, dass das Programm bzw. PreferencePane beim Reaktivieren mit gedrückter Option Taste entsprechend reagiert dann weiss ich auch nicht mehr weiter.

    Alterniv kannst Du einfach in den Methoden:

    Quellcode

    1. - (BOOL)acceptsFirstResponder
    2. - (BOOL)resignFirstResponder
    die Anzeige wieder auf "normal" zurück stellen. Der User muss dann halt die Option Taste einmal neu betätigen. Du hast aber nicht das Problem, dass evtl. bei der Reaktivierung noch die veränderte Anzeige zu sehen ist, obwohl die Option Taste nicht mehr gedrückt ist.

    Komfort in allen Ehren, aber damit sollte der User sehr gut leben können.
  • Original von below
    First responder ist das object eigentlich fast nie.

    Ok, ich hatte es in dem Beispiel Projekt ja über einen CustomView gelöst und da hatte ich den CustomView erst einmal immer zum firstResponder gemacht. ;)

    Alternativ musst Du mal gucken, ob Dir - (void)didSelect und - (void)willUnselect von NSPrefencePane da weiterhelfen können. Ich weiss nur nicht, ob die auch aufgerufen werden, wenn Du die Applikation wechselst oder nur innerhalb der Systemeinstellungen.