NSViewController in Responder Chain defekt?

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

  • NSViewController in Responder Chain defekt?

    Laut Apple Doku befindet sich der NSViewController ab macOS 10.10 in der Responder Chain.

    NSViewController Doku schrieb:

    In addition, in macOS 10.10 and later, a view controller participates in the responder chain. You can implement action methods directly in the view controller. Corresponding actions that originate in the view controller’s view proceed up the responder chain and are handled by those methods.
    Funktioniert auch mit macOS 10.12 soweit sehr gut nur halt nicht mit macOS 10.10. ?(

    Ist dies eine der Apple Implementierung, welche zwar ab 10.10 zur Verfügung stehen soll, aber erst ab 10.11 oder 10.12 fehlerfrei funktioniert oder übersehe ich etwas?

    Der Fehler tritt auf, sobald der First Responder das Window und nicht mehr ein Control im Window bzw. View des ViewControllers ist. Lässt sich dies irgendwie für 10.10 fixen?

    Unter 10.12 funktioniert es immer einwandfrei. Da hat Apple dann wohl bemerkt, dass es unter 10.10 noch fehlerhaft war.

    Aktuell befinden sich Actions aus dem Main Menu in dem ViewController, was ich schon sehr praktisch finde. Ich möchte diese Actions auch nicht gerne im NSDocument implementieren und auch keinen CustomWindowController verwenden.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MCDan ()

  • Ich verwende jetzt erst mal eine eigene NSApplication Klasse und habe targetForAction:to:from: überschrieben, um den ViewController als target zu ermitteln, wenn die default Implementierung dies nicht hin bekommt.

    Dies sieht dann aktuell so aus:

    C-Quellcode

    1. - (id)targetForAction:(SEL)theAction to:(id)theTarget from:(id)sender // override
    2. {
    3. id targetForAction = [super targetForAction:theAction to:theTarget from:sender];
    4. if (targetForAction == nil) {
    5. // Fix for a bug in 10.10 where the ViewController is only found as target when a subview of the ViewControllers view has the first responder
    6. NSWindow *keyWindow = [self keyWindow];
    7. if (keyWindow != nil && keyWindow.firstResponder == keyWindow) {
    8. NSWindowController *windowController = keyWindow.windowController;
    9. if (windowController != nil) {
    10. NSViewController *viewController = windowController.contentViewController;
    11. if (viewController != nil && [viewController respondsToSelector:theAction]) {
    12. targetForAction = viewController;
    13. }
    14. }
    15. }
    16. }
    17. return targetForAction;
    18. }
    Alles anzeigen
    Aktuell habe ich nur jeweils einen ViewController pro Window, so dass der o.a. Code für mich funktioniert.

    Verbesserungen, Hinweise etc. sind gerne willkommen. :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von MCDan ()