OSX ViewController mit Taste (Key Equivalent) beenden(dismiss())

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

Aufgrund der Corona-Krise: Die Veröffentlichung von Stellenangeboten und -gesuchen ist bis 31.12.2020 kostenfrei. Das beinhaltet auch Angebote und Gesuche von und für Freischaffende und Selbstständige.

  • OSX ViewController mit Taste (Key Equivalent) beenden(dismiss())

    Hallo,

    mir präsentiert sich da ein etwas merkwürdiges Verhalten beim Beenden eines ViewControllers (via NSTabViewController gesteuert). Beendet wird dieser mit einem Button, welcher mit dem FirstResponder (dismissController()) verbunden ist. Dies funktioniert einwandfrei solange:
    - der Butten direkt betätigt wird
    - bei Key Equivalent die Return-Taste eingetragen ist
    - nicht jedoch wenn bei Key Equivalent die ESC-Taste hinterlegt wird ;(


    Wenn die ESC-Taste eingetragen ist, erhalte ich nachfolgende Fehlermeldung:

    2020-05-28 11:07:19.033637+0200 Adressbuch[3577:169065] *** Assertion failure in -[Adressbuch.VCTop dismissViewController:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/AppKit/AppKit-1671.60.109/Controllers/NSViewController.m:858
    2020-05-28 11:07:19.134854+0200 Adressbuch[3577:169065] [General] An uncaught exception was raised
    2020-05-28 11:07:19.134942+0200 Adressbuch[3577:169065] [General] dismissViewController:: Error: maybe this view controller was not presented?
    2020-05-28 11:07:19.141865+0200 Adressbuch[3577:169065] [General] (
    0 CoreFoundation 0x00007fff4a95aacd __exceptionPreprocess + 256
    1 libobjc.A.dylib 0x00007fff7505ea17 objc_exception_throw + 48
    2 CoreFoundation 0x00007fff4a9757e6 +[NSException raise:format:arguments:] + 98
    3 Foundation 0x00007fff4cc16791 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 194
    4 AppKit 0x00007fff48423b02 -[NSViewController dismissViewController:] + 294


    Im First Responder des VC habe ich bereits nachgesehen, die ESC-Taste wurde da keiner weiteren Methode zugeordnet.

    Was den ganzen Vorgang noch irritierender werden lässt, ist, dass der zweite ViewController des NSTabViewController keine Probleme hat sich mit der ESC-Taste ordnungsgemäß beenden zu lassen. ?(


    Woran liegt dies und wie kann ich dies unterbinden bzw. lösen? :/


    Nachtrag:
    Nun bin ich vollkommen irritiert, denn wenn die Reihenfolge in der die VC des NSTabViewController angezeigt werden ändere - sprich zuerst den 2.'ten VC anzeigen lasse, funktioniert auch das Beenden des ersten VC mit der ESC-Taste. =O

    Nachtrag2:
    Nachfolgende Aktion habe ich zur Eingrenzung des Fehler durchgeführt:
    VC und Segue gelöscht und neu angelegt -> Fehlermeldung bleibt weiterhin bestehen
    Alle Objekte des VC gelöscht; bis auf den NSButton -> Verlassen des VC mittels eingetragener ESC-Taste funktioniert
    Alle Objekte des VC wieder hergestellt und im Anschluss alle NSTextField Objekte disabled -> ESC-Taste funktioniert

    Fazit: Ist nur ein NSTextfield aktiv, dabei spielt es keine Rolle welches, dann erscheint bei Verwendung der ESC-Taste obige Fehlermeldung.

    Bin nun mit meinem Latein am Ende. Ich hoffe jemand kann mir hier einen guten Rat bzw. Lösung mitteilen.

    Danke mal vorab.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von OSXDev () aus folgendem Grund: Nachtrag / Nachtrag2

  • Kurze Erklärung:
    dismiss() versucht einen ViewController zu schließen der nicht vorhanden ist (siehe Fehlermeldung), eigentlich müsste der TabViewController geschlossen werden! An dieser Stelle setzt mein Lösungsansatz an.

    Nach etlichen Stunden der Lösungssuche (der Debugger wird mein bestes Hilfsmittel), habe ich folgende Lösung gefunden:
    - einen weiteren ViewController anlegen
    - in diesem neu angelegtem VC einen Container View integrieren
    - den Container View mit dem NSTabViewController verknüpfen
    - den neu anlegten VC mit dem NSButton, welcher zuvor mit dem NSTabViewController verknüpft war, verbinden

    Siehe da, alles funktioniert nun einwandfrei. :D

    Hoffe es hilft einigen und erspart Stunden der Lösungssuche. :thumbup: