OSX Swift NSToolbar Printer Icon deaktiviert

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

  • OSX Swift NSToolbar Printer Icon deaktiviert

    Hallo,

    ich erstelle gerade eine Customized-NSToolbar. Alle meine Icons (NSToolbarItems) funktionieren einwandfrei. Bei den Standart-ToolbarItems (Colors, Fonts funktionieren) ist das Printer Icon deaktiviert. Mir gehen die Ideen aus. ?( Ich bekomme es nicht aktiviert. :/ Woran könnte dies liegen?

    Danke mal jeden guten Hinweis vorweg.
  • MyMattes schrieb:

    Implementierst Du denn eine Methode zum Drucken? Ich meine mich zu erinnern, dass zumindest bei document-based Apps UI-Elemente automatisch disabled werden, wenn das Dokument nicht die entsprechenden Methoden liefert.

    Mattes
    Methode ist implementiert. :thumbsup: Wenn ich wenigstens eine Fehlermeldung erhalten würde, dann hätte ich zumindest einen Anhaltspunkt. ?( So ist nennt sich dies im Trüben fischen. :S

    Habe auch schon ein Bespiel aus unserer Literatur probiert. Funktioniert ebenfalls nicht. ;(
  • MCDan schrieb:

    Um welchen App Typ handelt es sich?

    Document-Based? Dort musst Du die Methode printOperationWithSettings:error: in Deiner NSDocument Klasse implementieren?

    Anderenfalls sollte es die print: Methode in einer Custom NSWindow Klasse sein.
    App (Storyboard) und die print: Methode wurde implementiert s.o.. Der Erfolg blieb aus, in der Literatur konnte ich auch keine Hinweise finden. Ich bin mir sicher, dass ich da irgendwo einen Querverweis ausser acht gelassen habe. Nachdem ich gestern den Debugger bemüht hatte und dieser nicht einmal die Methode aufgerufen hatte - hatte ich mich entschlossen es auf heute zu verschieben und nicht in die Schreibtischplatte zu beißen. 8)

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von OSXDev ()

  • Also wenn Du den Menüpunkt für Print nicht geändert hast, dann geht dieser an den Selector print: vom First Responder.

    Die Responder Chain bei einer Single View Application ist:

    - First Responder
    - View Hierarchy
    - NSWindow
    - NSWindowController
    - NSWindow Delegate
    - NSApp
    - App Delegate

    Ich hatte es gestern mal explizit mit einem Test Projekt in Xcode 10.2 ausprobiert, da in einem macOS SDK auch mal der ViewController in der Responder Chain war, meine ich zumindest Bei dem Test Projekt hatte nur print: in einer Custom NSWindow Klasse funktioniert. Anderenfalls kam eine automatische Meldung von AppKit, dass die App keine Print Funktion hat. Diese hat Apple wohl irgendwann hinzugefügt, da ich die automatische Meldung bisher nicht kannte.

    In AppKit fummeln seit einigen Jahren wohl immer mal neue Entwickler bei Apple rum, die das bisherige Prinzip hier und da leicht abändern, so dass bisherige Lösungen dann leider nicht mehr funktionieren oder sogar Bugs zurück bleiben.

    Vielleicht wird AppKit irgendwann mal komplett von Catalyst abgelöst. Catalyst sieht deutlich einfacher und aufgeräumter als AppKit aus, da der Ursprung UIKit ist.
  • @MCDan: Danke für Deine Unterstützung. Toll, dass Du dies in einer eigens dafür erstellen Testapp getestet hat. :thumbsup:

    Jedoch komme ich hier nicht weiter. ;( Es spielt keine Rolle wo ich die print() Methode implementiere. Sie wird einfach nicht aufgerufen. So etwas frage ich normalerweise nicht, aber ich habe enormen Zeitdruck und keine Anhaltspunkte, welche mir hier zumindest die Richtung deuten würden - würdest Du mir mal Deine Testapp bzw. die wesentlichen Auszüge/Einträge hier zur Verfügung stellen? Wäre wirklich sehr hilfreich.

    Danke mal vorab.

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

  • MyMattes schrieb:

    Nicht sicher, ob Dir das hilft, aber implementierst Du "print:" mit der richtigen Notation, sprich Parametern? Nicht als dumme Frage gemeint, darüber stolpere ich manchmal.

    Gerade unterwegs, aber müsste m. E. "(id)sender" sein ... in ObjC :)

    Mattes
    @MyMattes: Alles gut Mattes. Daran habe ich auch schon gedacht und nochmals alles geprüft. Den Debugger ebenfalls nochmals bemüht um den Weg, den MCDan - s. o. - mitgeteilt hat, nachzuvollziehen. Aber irgendwie fehlt mir da ein Connect. Bin hier wirklich am verzweifeln.
  • Anbei das Mini Projekt. Mir ist gerade aufgefallen, dass es um ein ToolbarItem Print und nicht um den Menüpunkt Print geht.

    In dem geänderten Projekt funktionieren jetzt ToolbarItem und Menüpunkt. ;)

    Anstelle von item.target = self kannst Du auch item.target = nil verwenden, wenn Dein NSToolbarDelegate nicht die NSWindow Klasse ist. Bei target = nil läuft die Action dann über den First Responder und die Responder Chain.

    Print.zip

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

  • MCDan schrieb:

    Anbei das Mini Projekt. Mir ist gerade aufgefallen, dass es um ein ToolbarItem Print und nicht um den Menüpunkt Print geht.

    In dem geänderten Projekt funktionieren jetzt ToolbarItem und Menüpunkt. ;)

    Anstelle von item.target = self kannst Du auch item.target = nil verwenden, wenn Dein NSToolbarDelegate nicht die NSWindow Klasse ist. Bei target = nil läuft die Action dann über den First Responder und die Responder Chain.
    @MCDan: Super - Du hast mir eine Nacht voller Arbeit erspart. :thumbsup: Wie vermutet hatte ich im Window bei Referencing Outlets einen Eintrag (Connect auf die Toolbar) zu wenig. Im Nachhinein muss ich mir wohl eingestehen, dass ich einige Testapps zuviel erstellt habe und mir auf diesem Pfade wohl dieser Eintrag verloren gegangen ist - schlicht und einfach vergessen worden.

    Nun kann ich zumindest das vermeidliche Fehlverhalten vollständig nachvollziehen und ruhigen Gewissens den Feierabend einleiten. :sleeping:

    An dieser Stelle nochmals ein großes Dankeschön, MCDan. :thumbsup:
  • @MCDan: Eine paar Fragen habe ich noch. Ich habe mal testweise im IB, die innerhalb von Referencing Outlets angelegte Verbindung zur Toolbar entfernt. Wie erwartet wird das Printer Icon in der Toolbar deaktiviert - grau. Der Menüpunkt Print funktioniert dennoch.

    Daraufhin habe ich in der Klasse MyWindow das NSToolbarDelegate auskommentiert. Warum funktioniert der Menüpunkt Print dennoch?

    Das Toolbar Icon funktioniert nur, wenn die Verbindung im IB und in der MyWindow-Klasse das Delegate auf die Toolbar, vorhanden ist. Warum ist dies so? ?(

    Mir ist gerade noch etwas aufgefallen. Mit dem Toolbar Pint Icon wird grundsätzlich - wie erwartet - die Methode printWindow() aufgerufen. Dies trifft beim Menüpunkt Print nur zu, solange kein weiteres Element (wie z.B. ein NSTextField) vorhanden ist. Warum ist dies so und warum wird, im Falles des vorhanden seins eines Elementes, das Print Menüfenster mit dem Element aufgerufen?
    Ich dachte - zumindest meine ich dies so nachgelesen zu haben -, dass das Print Fenster mit dem entsprechenden Druckobjekt nur erscheint, wenn dem Objekt/Element explizit ein Connect zum First Responder/print: zugewiesen wurde? ?(

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

  • OSXDev schrieb:

    @MCDan: Eine paar Fragen habe ich noch. Ich habe mal testweise im IB, die innerhalb von Referencing Outlets angelegte Verbindung zur Toolbar entfernt. Wie erwartet wird das Printer Icon in der Toolbar deaktiviert - grau. Der Menüpunkt Print funktioniert dennoch.

    Daraufhin habe ich in der Klasse MyWindow das NSToolbarDelegate auskommentiert. Warum funktioniert der Menüpunkt Print dennoch?

    Das Toolbar Icon funktioniert nur, wenn die Verbindung im IB und in der MyWindow-Klasse das Delegate auf die Toolbar, vorhanden ist. Warum ist dies so? ?(
    Ich tippe mal, dass Du mit "im IB, die innerhalb von Referencing Outlets angelegte Verbindung zur Toolbar entfernt." die Entfernung des Toolbar Delegate meinst.

    Wenn die Toolbar keinen Delegate hat, dann wird in dem Test Projekt die Delegate Methode toolbarWillAddItem(_:) nicht mehr aufgerufen, in welcher das Print Toolbar Item durch setzen von target und action quasi "aktiviert" wird. Ein Toolbar Item, welches keine action hat, ist natürlich ohne Funktion und wird daher von AppKit deaktiviert. Weiterhin wird ein Toolbar Item mit First Responder target, also target = nil, deaktiviert, wenn kein passendes Target zur eingestellten action in der Responder Chain gefunden wird. Dieses Verhalten kommt in einer Document-Based App z.B. dann zum tragen, wenn kein Dokument Fenster geöffnet ist. Dann würde ein aktiviertes Print Toolbar Item ja keinen Sinn machen. ;)

    Der Menüpunkt Print hat ja, erst mal, nichts mit dem Toolbar Item Print zu tun. Dies sind zwei verschiedene Objekte, die "nur" die gleiche action in der Responder Chain verwenden, was ja auch Sinn macht, da der Menüpunkt und das Toolbar Item die gleiche Funktion, also den Druck, auslösen sollen. Da würden zwei verschiedene actions nicht wirklich Sinn machen und den Anwender ggf. verwirren, wenn unterschiedliche Druck Funktionen durch den Menüpunkt und das Toolbar Item ausgelöst werden.

    OSXDev schrieb:

    Mir ist gerade noch etwas aufgefallen. Mit dem Toolbar Pint Icon wird grundsätzlich - wie erwartet - die Methode printWindow() aufgerufen. Dies trifft beim Menüpunkt Print nur zu, solange kein weiteres Element (wie z.B. ein NSTextField) vorhanden ist. Warum ist dies so und warum wird, im Falles des vorhanden seins eines Elementes, das Print Menüfenster mit dem Element aufgerufen?

    Ich dachte - zumindest meine ich dies so nachgelesen zu haben -, dass das Print Fenster mit dem entsprechenden Druckobjekt nur erscheint, wenn dem Objekt/Element explizit ein Connect zum First Responder/print: zugewiesen wurde? ?(
    Wenn Du bei dem Print Toolbar Item das target auf nil, also den First Repsonder, setzt. Dann sollte dieses, analog zum Menüpunkt, auch bei einem aktivierten TextField funktionieren. Wobei ich mir bei Swift nicht so sicher bei (s.u.).

    Dies liegt an der Responder Chain von AppKit und der Tatsache, dass NSTextField auch die Methode printView(_:) (geehrbt) von NSView kennt. Interessanterweise gibt es in Objektive-C nur print: (bei NSView uns NSWindow) und in Swift printView(_:) (bei NSView) und printWindow(_:) (bei NSWindow). Keine Ahnung warum Apple dies in Swift geändert hat. Evtl. wollte man gleiche Namen in unterschiedlichen Klassen vermeiden, oder besser unterscheiden können, ob die App einen View oder ein Fenster drucken kann. Evtl. wird in dem Test Projekt die print Methode in einem TextField jetzt nicht durch das Print Toolbar Item getriggert, da dieses die action printWindow(_:) hat. Da musst Du mal ein wenig experimentieren. ;)
  • MCDan schrieb:

    ...

    Der Menüpunkt Print hat ja, erst mal, nichts mit dem Toolbar Item Print zu tun. Dies sind zwei verschiedene Objekte, die "nur" die gleiche action in der Responder Chain verwenden, was ja auch Sinn macht, da der Menüpunkt und das Toolbar Item die gleiche Funktion, also den Druck, auslösen sollen. Da würden zwei verschiedene actions nicht wirklich Sinn machen und den Anwender ggf. verwirren, wenn unterschiedliche Druck Funktionen durch den Menüpunkt und das Toolbar Item ausgelöst werden.

    ...
    Stimmt, das macht durchaus Sinn.


    MCDan schrieb:

    ...


    Wenn Du bei dem Print Toolbar Item das target auf nil, also den First Repsonder, setzt. Dann sollte dieses, analog zum Menüpunkt, auch bei einem aktivierten TextField funktionieren. Wobei ich mir bei Swift nicht so sicher bei (s.u.).


    ...
    Das habe ich probiert und es verhält sich dann anlog des Menüpunktes Print.


    Ich würde es besser finden wenn die Abläufe bei Objective-C und Swift grundsätzlich analog gehalten würden.

    Viele Beispiele sind einfach i.A. unter Objective-C realisiert und Swift verhält sich da hin und wieder nicht konform, was mich dann sehr ins grübeln bringt, da unser Buchfundus mehrheitlich auf Objective-C beruht.

    MCDan, Du hast mir wirklich sehr geholfen. Vielen Dank für Deine tatkräftige Unterstützung. :thumbsup:

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