Benutzerdefinierte Ausschneiden, Kopieren und Einfügen für WKWebView

10

Ich entwickle eine Cocoa-Anwendung, um eine von mir entwickelte JavaScript-Webanwendung zu umwandeln, die das Bearbeiten von SVG-Grafiken ermöglicht. Ich habe die folgende Frage, die durch den Wunsch motiviert ist, die Operationen Ausschneiden, Kopieren und Einfügen und die damit verbundenen Menüoptionen anzupassen.

Wie kann ich entweder:

  • ersetze meinen eigenen Responder anstelle von WKWebView oder
  • Anpassen der Antworten auf validateMenuItem: und die cut: , copy: und paste: Selektoren?

Ich bin besonders an Lösungen interessiert, die die nützliche WKWebView-Funktionalität des Ausschneidens, Kopierens und Einfügens für Textfelder beibehalten.

Jede Hilfe wäre sehr willkommen. Detail folgt.

Der Zweck meines Cocoa Wrappers ist dreifach:

  1. um Persistenz zu gewährleisten
  2. zur Bereitstellung der Zwischenablage-Integration
  3. zum Ausdrucken

Ich habe 1 erreicht, bin aber auf 2 und 3 gesperrt; Diese Frage ist etwa 2.

Insbesondere kann ich das Framework nicht dazu bringen, irgendeine von mir bereitgestellte Implementierung von validateMenuItem: aufzurufen. Daher habe ich keine Kontrolle darüber, wann die Menüelemente Ausschneiden, Kopieren oder Einfügen für den Benutzer zur Auswahl stehen.

Ich habe Folgendes versucht:

  1. Markieren Sie meine NSViewController-Unterklasse als akzeptierenden ersten Responder und überschreiben Sie validateMenyItem: dort - meine Implementierung wurde nie
  2. aufgerufen
  3. Unterklasse WKWebView und override validateMenuItem: - meine Implementierung wurde nie
  4. aufgerufen
  5. Unterklasse NSWindowController und überschreiben validateMenuItem: - meine Implementierung wurde nie
  6. aufgerufen

Jetzt hat meine eingewickelte Web-App einige Textfelder. Wenn ich einen solchen Fokus gebe und wenn es angemessen ist (Text ist in der Zwischenablage; ich markiere einen Text), werden die Optionen Ausschneiden, Kopieren und Einfügen in meinem Bearbeiten-Menü automatisch aktiviert. Sie arbeiten sogar. (Ich mag diese Funktionalität und möchte sie behalten.) Daher vermute ich, dass das WKWebView als mein erster Ersthelfer alle Aufrufe von validateMenuItem: entlang der Responderkette abfängt. Aber ich muss auch in der Lage sein, Menüpunkte entsprechend anderer Zustände in meiner eingepackten Web-App zu aktivieren - zum Beispiel, wenn der Benutzer eine SVG-Grafik auswählt.

Aktualisieren

Ich habe zusätzliches Graben gemacht, um eine Lösung für mein Problem zu finden. In meiner WKWebView-Unterklasse habe ich eine benutzerdefinierte @IBAction hinzugefügt. Ich habe einen Menüeintrag dafür auf meinem Storyboard erstellt und den Menüpunkt mit FirstResponder verdrahtet und meine neue Aktion ausgewählt.

Und mein validateMenuItem: in meiner WKWebView-Unterklasse wurde aufgerufen. Aber nur für diesen neuen Selektor, nicht für den copy: Selektor, der dem @IBAction zugeordnet ist, das ich zuvor meiner WKWebView-Unterklasse hinzugefügt hatte.

Nun, meine copy: -Methode, markiert mit @IBAction und mit der Methodensignatur für Dinge, die Interface Builder (oder wie auch immer es in diesen Tagen heißt) verwenden kann, ist nicht markiert override . Als ich versucht habe, override zu markieren, habe ich einen Fehler erhalten. Offensichtlich bietet WKWebView keine copy:id -Methode - obwohl es Kopierfunktionalität bietet und den Menüeintrag korrekt behandelt, wenn Text in einem Textfeld ausgewählt ist.

Es scheint also, dass WKWebView automatisch (und immer) die Validierung für bestimmte Selektoren übernimmt, die normalerweise an Menüs gebunden sind - insbesondere cut: , copy: und paste: . Außerdem ist das Unterklassifizieren von WKWebView und das Überschreiben von validateMenuItem: nicht ausreichend, um dieses Standardverhalten zu unterbrechen / zu kontrollieren. Welches scheint ungerade.

Aber beim Lesen anderer Beiträge zu WKWebView auf StackOverflow weiß ich, dass WKWebView eigentlich eine ziemlich komplexe Funktionalität ist. Von besonderem Interesse / Interesse ist für mich, dass WKWebView den Web-Content tatsächlich in einem separaten Prozess ausführt. Ich frage mich daher, ob etwas in Verbindung mit diesem separaten Prozess für die Menüvalidierung und die Behandlung von cut: , copy: und paste: verantwortlich ist - etwas, das innerhalb des Frameworks liegt und auf das ich keinen Zugriff habe.

Ich hoffe immer noch auf eine Lösung. Hoffentlich wird sich das obige Update als nützlich erweisen.

    
M. Anthony Aiello 31.03.2015, 19:07
quelle

1 Antwort

0

Seltsamerweise habe ich auch versucht, über WKWebView ein Vektor-Design-Tool auf den Mac zu portieren, und habe das gleiche Problem festgestellt. Es sieht so aus, als könnten Sie die Menüelemente zum Ausschneiden / Kopieren / Einfügen von in JavaScript steuern . Wenn Sie beforecopy und beforecut event handlers und preventDefault() sie hinzufügen, werden die Menüoptionen zum Ausschneiden und Kopieren aktiviert. Ich kann den Einfügemenüpunkt jedoch nicht aktivieren. Ich denke, das könnte an einem lang andauernden Bug in WebKit liegen . Sie können immer noch ⌘-V auf der Tastatur, und die Paste wird immer noch passieren, weil in diesem Fall WebKit Aufruf beforepaste überspringen und nur das paste -Ereignis direkt auslösen. Ich kann einfach nicht herausfinden, wie man den Einfügemenü aktiviert. Als Workaround habe ich eine "falsche" Paste-Menüoption erstellt, die nicht zum normalen paste: -Selektor, sondern zu meinem eigenen Selektor führt, den WKWebView nicht abfängt.

    
Ming-Yee Iu 03.08.2017 22:38
quelle

Tags und Links