Erstellen von OS X-Anwendungen mit JavaScript

Ursprünglicher Autor: Tyler Gaw
  • Übersetzung
Vor kurzem hat OS X Yosemite die Möglichkeit eingeführt, JavaScript für die Automatisierung zu verwenden. Dies eröffnet die Möglichkeit, über JavaScript auf native OS X * -Frameworks zuzugreifen. Ich stöberte in dieser neuen Welt herum und sammelte einige Beispiele . In diesem Beitrag erkläre ich die Grundlagen und zeige Schritt für Schritt, wie eine kleine Anwendung erstellt wird . Die JavaScript-
Sitzung fand auf der WWDC 2014 statt. Es wurde Ihnen mitgeteilt, dass Sie jetzt JavaScript verwenden können, um Anwendungen anstelle von AppleScript zu automatisieren. Dies ist an sich eine aufregende Nachricht. Die Möglichkeit, sich wiederholende Vorgänge mit AppleScript zu automatisieren, gibt es schon seit geraumer Zeit. Das Schreiben in AppleScript ist keine angenehme Erfahrung, daher ist es sehr gut, die vertraute Syntax zu verwenden.
Während dieser Sitzung sprach der Redner mit Objective-C über die Brücke. Hier beginnt der Spaß. Mit der Bridge können Sie jedes Objective-C-Framework in eine JS-Anwendung importieren. Wenn Sie beispielsweise eine GUI mit Standard-OS X-Steuerelementen schreiben möchten, müssen Sie Cocoa importieren:
ObjC.import("Cocoa"); 

Die Freymork Foundation macht genau das, was ihr Name andeutet. Sie können damit Blöcke für OS X-Anwendungen zusammenstellen und verfügen über eine Vielzahl von Klassen und Protokollen. NSArray , NSURL , NSUserNotification usw. Sie sind vielleicht nicht mit allen vertraut, aber ihre Namen legen nahe, wofür sie sind. Aufgrund seiner extremen Bedeutung ist das Framework standardmäßig verfügbar, ohne dass es in eine neue Anwendung importiert werden muss.
Soweit ich weiß, können Sie in JavaScript das Gleiche tun wie in Objective-C oder Swift.

Beispiel


Hinweis: Damit dieses Beispiel funktioniert, benötigen Sie Yosemite Developer Preview 7. Der
beste Weg, etwas zu lernen, besteht darin, es einfach zu nehmen und zu versuchen, etwas zu tun. Ich zeige Ihnen den Prozess der Erstellung einer kleinen Anwendung, die Bilder von einem Computer anzeigen kann.
Sie können das vollständige Beispiel aus meinem Repository herunterladen .

Bildschirm der Anwendung, die ich schreiben werde.

In der Anwendung gibt es: ein Fenster, einen Textblock, ein Eingabefeld und eine Schaltfläche. Nun, oder nach Klassennamen: NSWindow , NSTextField , NSTextField und NSButton .
Durch Klicken auf die Schaltfläche " Dateiauswahl " wird NSOpenPanel geöffnetum eine Datei auszuwählen. Wir werden das Panel so konfigurieren, dass der Benutzer keine Dateien mit einer anderen Erweiterung als .jpg, .png und .gif auswählen kann.
Nachdem Sie das Bild ausgewählt haben, wird es im Fenster angezeigt. Das Fenster passt seine Größe an die Breite und Höhe des Bildes sowie die Höhe der Steuerelemente an. Wir werden auch die minimalen Fenstergrößen angeben, damit die Steuerelemente nicht verschwinden.

Projekteinrichtung


Öffnen Sie die Apple Script Editor- App unter Anwendungen> Dienstprogramme . Dies ist nicht der beste Editor, den ich ausprobiert habe, aber jetzt wird er benötigt. Es gibt eine Reihe notwendiger Funktionen zum Erstellen einer OS X-Anwendung unter JS. Ich bin nicht sicher, was unter der Haube vor sich geht, aber er weiß, wie man Skripte als Anwendungen kompiliert und ausführt. Es werden auch zusätzliche notwendige Dinge erstellt, wie z. B. die Datei Info.plist. Es scheint mir, dass es eine Gelegenheit gibt, andere Redakteure dazu zu zwingen, aber ich habe es noch nicht herausgefunden.
Erstellen Sie ein neues Dokument über Datei> Neu oder cmd + n . Als erstes müssen wir das Dokument als Anwendung speichern. Speichern Sie es über Datei> Speichern oder cmd + s. Beeilen Sie sich nicht, um einmal zu sparen. Es sind zwei Einstellungen erforderlich, um das Projekt als Anwendung auszuführen.

Skript-Editor mit den erforderlichen Einstellungen

Ändern Sie das Format in „Anwendung“ und aktivieren Sie das Kontrollkästchen „Nicht schließen“. **
Wichtiger Hinweis: Sie können diese Einstellungen ändern: Öffnen Sie das Menü Datei und halten Sie die Optionstaste gedrückt. Dadurch wird das Element "Speichern unter ..." geöffnet. Im Speicherdialog können Sie Änderungen an den Einstellungen vornehmen. Es ist jedoch besser, dies sofort zu tun, wenn Sie ein Projekt erstellen.
Wenn Sie das Kontrollkästchen "Nicht schließen" nicht aktivieren, wird Ihre Anwendung geöffnet und sofort geschlossen. Es gibt fast keine Dokumentation zu dieser Funktionalität im Internet. Das habe ich erst erfahren, als ich mich stundenlang mit der Stirn auf die Tastatur geschlagen habe.

Lass uns schon etwas machen!


Fügen Sie Ihrem Skript die folgenden Zeilen hinzu und führen Sie alles über Skript> Anwendung ausführen oder cmd + r aus .
ObjC.import("Cocoa");  
$.NSLog("Hi everybody!"); 

Es ist fast nichts passiert. Die einzigen sichtbaren Änderungen sind in der Menüleiste und im Dock. Der Name der Anwendung und die Elemente Datei und Bearbeiten wurden in der Menüleiste angezeigt. Sie können sehen, dass die Anwendung ausgeführt wird, da sich das Symbol jetzt im Dock befindet.
Wo steht die Zeile "Hallo zusammen!"? Und was ist das Dollarzeichen, jQuery? Schließen Sie die Anwendung über Datei> Beenden oder cmd + q und lassen Sie uns herausfinden, wo dieses NSLog passiert ist.
Öffnen Sie die Konsole: Programme> Dienstprogramme> Konsole . Jede Anwendung kann etwas in die Konsole schreiben. Es unterscheidet sich kaum von den Entwicklertools in Chrome, Safari oder Firefox. Der Hauptunterschied besteht darin, dass Sie Anwendungen anstelle von Sites debuggen.
Es hat viele Botschaften. Filtern Sie es, indem Sie „Applet“ in die Suchleiste in der oberen rechten Ecke schreiben. Kehren Sie zum Skript-Editor zurück und führen Sie die Anwendung erneut über opt + cmd + r aus .

Schon gesehen? Die Meldung "Hallo allerseits!" Sollte in der Konsole erscheinen. Ist dies nicht der Fall, schließen Sie die Anwendung und führen Sie sie erneut aus. Oft habe ich vergessen, es zu schließen und der Code wurde nicht gestartet.

Was ist mit dem Dollarzeichen?


Das Dollarzeichen ist Ihr Zugang zur Brücke in Objective-C. Jedes Mal, wenn Sie auf eine Objective-C-Klasse oder -Konstante zugreifen müssen, müssen Sie $ .foo oder ObjC.foo verwenden . Später werde ich über andere Verwendungsmöglichkeiten von $ sprechen .
Die Konsolenanwendung und NSLog sind unersetzliche Dinge. Sie werden sie immer zum Debuggen verwenden. In meinem NSLog-Beispiel erfahren Sie, wie Sie etwas anderes als Zeichenfolgen protokollieren .

Erstellen Sie ein Fenster


Lassen Sie uns etwas tun, um mit ihnen zu interagieren. Fügen Sie Ihren Code hinzu:
ObjC.import("Cocoa");  
var styleMask = $.NSTitledWindowMask | $.NSClosableWindowMask | $.NSMiniaturizableWindowMask; 
var windowHeight = 85; 
var windowWidth = 600;  
var ctrlsHeight = 80;  
var minWidth = 400; 
var minHeight = 340; 
var window = $.NSWindow.alloc.initWithContentRectStyleMaskBackingDefer( $.NSMakeRect(0, 0, windowWidth, windowHeight), styleMask, $.NSBackingStoreBuffered, false );  
window.center; 
window.title = "Choose and Display Image"; 
window.makeKeyAndOrderFront(window); 

Führen Sie dann die Anwendung aus. opt + cmd + r . Jetzt lass uns reden! Mit einer kleinen Menge Code haben wir eine Anwendung erstellt, die verschoben, minimiert und geschlossen werden kann.

Ein einfaches NSWindow-Fenster, das mit JS erstellt wurde

Wenn Sie wie ich noch nie Anwendungen mit Objective-C oder Cocoa erstellen mussten, sieht das alles möglicherweise etwas verrückt aus. Die Länge der Methodennamen schien mir so. Ich mag beschreibende Namen, aber Cocoa geht zu weit.
Dies ist jedoch JavaScript. Der Code sieht so aus, als würden Sie eine Website schreiben.
Was passiert in den ersten Zeilen, in denen wir den styleMask- Wert setzen ?? Stilmasken werden zum Anpassen von Fenstern verwendet. Jede Option gibt an, was hinzugefügt wird. Titel, Schließen-Schaltfläche, Minimieren-Schaltfläche. Diese Optionen sind Konstanten. Verwenden Sie bitweise oder ("|"), um eine Einstellung von einer anderen zu trennen.
Es gibt viele Möglichkeiten. Sie können alle in der Dokumentation nachlesen . Versuchen Sie, NSResizableWindowMask hinzuzufügen, und sehen Sie, was passiert.
Sie müssen sich ein paar interessante Dinge über die Syntax merken. $ .NSWindow.alloc ruft die alloc Objekt NSWindow. Beachten Sie, dass nach dem Aufruf der Methode keine Klammern vorhanden sind. In JavaScript erhalten Sie Zugriff auf Eigenschaften und nicht auf Methoden. Wie ist das In JS für OS X sind Klammern nur zulässig, wenn Sie Parameter übergeben. Der Versuch, Klammern ohne Argumente zu verwenden, führt zu einem Laufzeitfehler. Wenn etwas schief geht, suchen Sie in der Konsole nach Fehlern.
Hier ist ein Beispiel für einen superlangen Methodennamen:
initWithContentRectStyleMaskBackingDefer 

In der Dokumentation zu NSWindow sieht diese Methode etwas anders aus:
initWithContentRect:styleMask:backing:defer:
In Objective-C werden solche Fenster folgendermaßen erstellt:
NSWindow* window [[NSWindow alloc] 
    initWithContentRect: NSMakeRect(0, 0, windowWidth, windowHeight) 
    styleMask: styleMask, 
    backing: NSBackingStoreBuffered 
    defer: NO
];

Beachten Sie die Doppelpunkte (":") in der ursprünglichen Beschreibung der Methode. Um die Objective-C-Methode in JS zu verwenden, müssen Sie sie entfernen und den nächsten Buchstaben durch einen Großbuchstaben ersetzen. Eckige Klammern ("[]") sind Aufrufe einer Klassen- / Objektmethode. [NSWindow alloc] ruft die alloc- Methode der NSWindow- Klasse auf . In JS entspricht dies NSWindow.alloc sowie erforderlichenfalls eckigen Klammern.
Ich denke, der Rest des Codes ist recht einfach. Ich werde ihre detaillierte Beschreibung vermissen. Um zu verstehen, was als nächstes passiert, werden Sie viel Zeit benötigen und eine Menge Dokumentation lesen müssen, aber Sie können damit umgehen. Wenn Sie ein Fenster sehen, ist es bereits großartig. Lass uns etwas anderes machen.

Steuerelemente hinzufügen


Wir brauchen eine Beschriftung, ein Textfeld und eine Schaltfläche. Wir werden NSTextField und NSButton verwenden . Aktualisieren Sie Ihren Code und führen Sie die Anwendung erneut aus.
ObjC.import("Cocoa"); 
var styleMask = $.NSTitledWindowMask | $.NSClosableWindowMask | $.NSMiniaturizableWindowMask; 
var windowHeight = 85; 
var windowWidth = 600; 
var ctrlsHeight = 80; 
var minWidth = 400; 
var minHeight = 340; 
var window = $.NSWindow.alloc.initWithContentRectStyleMaskBackingDefer( $.NSMakeRect(0, 0, windowWidth, windowHeight), styleMask, $.NSBackingStoreBuffered, false ); 
var textFieldLabel = $.NSTextField.alloc.initWithFrame($.NSMakeRect(25, (windowHeight - 40), 200, 24)); 
textFieldLabel.stringValue = "Image: (jpg, png, or gif)"; 
textFieldLabel.drawsBackground = false; 
textFieldLabel.editable = false; 
textFieldLabel.bezeled = false; 
textFieldLabel.selectable = true; 
var textField = $.NSTextField.alloc.initWithFrame($.NSMakeRect(25, (windowHeight - 60), 205, 24));
textField.editable = false; 
var btn = $.NSButton.alloc.initWithFrame($.NSMakeRect(230, (windowHeight - 62), 150, 25)); 
btn.title = "Choose an Image..."; 
btn.bezelStyle = $.NSRoundedBezelStyle; 
btn.buttonType = $.NSMomentaryLightButton; 
window.contentView.addSubview(textFieldLabel); 
window.contentView.addSubview(textField); 
window.contentView.addSubview(btn); 
window.center; 
window.title = "Choose and Display Image"; 
window.makeKeyAndOrderFront(window); 

Wenn alles gut gegangen ist, haben Sie jetzt ein Fenster mit Steuerelementen. Es kann nichts in das Feld eingegeben werden, und der Knopf tut nichts, aber Moment, wir bewegen uns bereits vorwärts.

Fenstersteuerung

Was haben wir hier gemacht? textFieldLabel und textField sind einander ähnlich. Sie sind beide Instanzen von NSTextField . Wir haben sie genauso erstellt wie das Fenster. Wenn Sie initWithFrame und NSMakeRect sehen , wird höchstwahrscheinlich hier ein UI-Element erstellt. NSMakeRect macht, was in seinem Namen gerendert wird. Es wird ein Rechteck mit den angegebenen Koordinaten und Abmessungen erstellt. (x, y, breite, höhe). Dadurch wird eine von Objective-C als "Struktur" bezeichnete Struktur erstellt. In JS könnte das Äquivalent ein Objekt, ein Hash oder möglicherweise ein Wörterbuch sein. Schlüssel-Wert-Paare.
Legen Sie nach dem Erstellen der Textfelder für jede Handvoll Eigenschaften das gewünschte Ergebnis fest. Kakao hat nichts wie das HTML-Label-Element. Schalten Sie den Hintergrund und die Bearbeitungsmöglichkeiten aus.
Wir werden das Textfeld programmgesteuert einstellen und gleichzeitig die Bearbeitung deaktivieren. Wenn wir das nicht gebraucht hätten, hätten wir es auf einer Linie geschafft.
Um die Schaltfläche zu erstellen, verwenden wir NSButton . Wie beim Textfeld benötigen wir eine Struktur. Wählen Sie zwei Eigenschaften aus: bezelStyle und buttonType. Die Werte von beiden sind Konstanten. Diese Eigenschaften bestimmen, wie das Element gezeichnet wird und welche Stile es haben wird. In der NSButton-Dokumentation erfahren Sie, was Sie sonst noch mit der Schaltfläche tun können. Ich habe auch ein Beispiel, das verschiedene Stile und Arten von Schaltflächen in Aktion zeigt.
Das letzte der neuen Dinge, die wir hier tun, ist das Hinzufügen von Elementen zum Fenster mit addSubView . Das erste Mal habe ich versucht, dies mit zu tun
window.addSubview(theView)

In anderen Standardansichten, die Sie mit NSView erstellen, funktioniert dies, jedoch nicht mit NSWindow- Instanzen . Ich weiß nicht warum, aber in Windows müssen Elemente zur Inhaltsansicht hinzugefügt werden . In der Dokumentation heißt es: "Das oberste verfügbare NSView in der Fensterhierarchie." Es hat bei mir funktioniert.

Den Knopf zum Laufen bringen


Wenn Sie auf die Schaltfläche "Bild auswählen" klicken, wird ein Fenster geöffnet, in dem die Dateien auf dem Computer angezeigt werden. Lassen Sie uns vorher aufwärmen, indem Sie der Konsole eine Nachricht hinzufügen, wenn Sie auf die Schaltfläche klicken.
In JS werden Ereignishandler an Elemente angehängt, um Klicks zu verarbeiten. Objective-C verwendet ein etwas anderes Konzept. Es verwendet das, was als Messaging *** bezeichnet wird. Das heißt, Sie übergeben eine Nachricht an das Objekt, das den Namen der Methode enthält. Das Objekt muss Informationen darüber enthalten, was zu tun ist, wenn es eine solche Nachricht empfängt. Dies ist möglicherweise nicht die genaueste Beschreibung, aber ich verstehe sie.
Zuerst müssen Sie das Ziel und die Aktion auf der Schaltfläche festlegen . Ziel ist das Objekt, an das die in der Aktion enthaltene Nachricht gesendet werden soll. Wenn es jetzt nicht klar ist, fahren Sie fort, Sie werden alles verstehen, wenn Sie den Code sehen. Aktualisieren Sie den Teil des Skripts, in dem die Schaltfläche konfiguriert ist:
... 
btn.target = appDelegate; 
btn.action = "btnClickHandler"; 
...

appDelegate und btnClickHandler existieren noch nicht. Wir müssen sie machen. Im folgenden Code ist die Reihenfolge wichtig. Ich habe Kommentare hinzugefügt, um zu zeigen, wo der neue Code ist.
ObjC.import("Cocoa"); 
// Вот здесь 
ObjC.registerSubclass({ 
    name: "AppDelegate",
    methods: { 
        "btnClickHandler": { 
            types: ["void", ["id"]], implementation: function (sender) { $.NSLog("Clicked!"); 
            } 
        } 
    } 
}); 
var appDelegate = $.AppDelegate.alloc.init; 
// Вот до сюда 
// Далее то, что уже было 
var textFieldLabel = $.NSTextField.alloc.initWithFrame($.NSMakeRect(25, (windowHeight - 40), 200, 24)); 
textFieldLabel.stringValue = "Image: (jpg, png, or gif)"; 
... 

Starten Sie die Anwendung, klicken Sie auf die Schaltfläche und sehen Sie sich die Konsole an. Wenn Sie auf eine Schaltfläche klicken, wird die Meldung "Angeklickt!" Angezeigt. Wenn ja, dann ist es nur ein Trottel, oder? Wenn nicht, überprüfen Sie den Code und die Fehler in der Konsole.

Vererbung


Was ist ObjC.registerSubclass ? Vererbung ist eine Möglichkeit, eine neue Klasse zu erstellen, die von einer anderen Objective-C-Klasse erbt. Lyrischer Exkurs: Hier besteht die Möglichkeit, dass ich die falsche Terminologie verwende. Bekämpfe mich. registerSubclass verwendet ein Argument: ein JS-Objekt, das die Eigenschaften des neuen Objekts enthält. Eigenschaften können sein: Name , Oberklasse , Protokolle , Eigenschaften und Methoden . Ich bin mir zu 100% nicht sicher, ob dies eine vollständige Liste ist, aber dies wird in den Versionshinweisen beschrieben .
Das ist alles schön und gut, aber was haben wir hier getan? Da wir keine Superklasse angegeben haben, erben wir von NSObject. Dies ist die Basisklasse für die meisten Objective-C-Klassen. Mit der Eigenschaft name können wir in Zukunft über $ oder ObjC auf die neue Klasse zugreifen .
$ .AppDelegate.alloc.init; Erstellt eine Instanz unserer Klasse AppDelegate . Beachten Sie erneut, dass die Klammern für die Aufrufe der Methoden alloc und init nicht verwendet werden, da wir ihnen keine Argumente übergeben.

Erben Methoden


Die Methode wird erstellt, indem ein beliebiger Zeichenfolgenname zugewiesen wird. Zum Beispiel btnClickHandler . Übergeben Sie ein Objekt mit Typen und Implementierungseigenschaften . Ich fand keine offizielle Dokumentation darüber, was das Typarray enthalten sollte. Durch Versuch und Irrtum wurde mir klar, dass es ungefähr so ​​aussieht:
["return type", ["arg 1 type", "arg 2 type",...]] 

btnClickHandler gibt nichts zurück, daher ist das erste Element ungültig. Es benötigt einen Parameter, das Objekt, das die Nachricht sendet. In unserem Fall NSButton , den wir btn nannten . Eine vollständige Liste der Typen finden Sie hier .
Implementierung ist eine reguläre Funktion. Darin schreiben Sie JavaScript. Sie haben den gleichen Zugriff auf $ wie außerhalb des Objekts. Außerdem stehen Ihnen Variablen zur Verfügung, die außerhalb der Funktion deklariert wurden.

Ein kleiner Hinweis zur Verwendung von Protokollen


Sie können Unterklassen von Cocoa-Protokollen erben, aber es gibt Fallstricke. Es ist mir gelungen herauszufinden, dass Ihr Skript einfach ohne Fehler abstürzt , wenn Sie das Protokollarray verwenden . Ich habe ein Beispiel und eine Erklärung geschrieben . Wenn Sie also mit ihnen arbeiten möchten, lesen Sie sie.

Bildauswahl und Anzeige


Wir sind bereit, das Panel zu öffnen, ein Bild auszuwählen und es anzuzeigen. Funktionscode aktualisieren
 btnClickHandler: 
... 
implementation: 
    function (sender) { 
        var panel = $.NSOpenPanel.openPanel; 
        panel.title = "Choose an Image"; 
        var allowedTypes = ["jpg", "png", "gif"]; 
        // NOTE: Мост из массива JS в массив NSArray
        panel.allowedFileTypes = $(allowedTypes); 
            if (panel.runModal == $.NSOKButton) { 
                // NOTE: panel.URLs - это NSArray, а не JS array 
                var imagePath = panel.URLs.objectAtIndex(0).path; 
                textField.stringValue = imagePath; 
                var img = $.NSImage.alloc.initByReferencingFile(imagePath); 
                var imgView = $.NSImageView.alloc.initWithFrame( $.NSMakeRect(0, windowHeight, img.size.width, img.size.height)); 
                window.setFrameDisplay( $.NSMakeRect( 0, 0, (img.size.width > minWidth) ? img.size.width : minWidth, ((img.size.height > minHeight) ? img.size.height : minHeight) + ctrlsHeight ), true ); 
                imgView.setImage(img); 
                window.contentView.addSubview(imgView); window.center; 
                } 
            } 

Zunächst erstellen wir eine Instanz von NSOpenPanel . Sie haben die Bedienfelder in Aktion gesehen, wenn Sie jemals eine Datei ausgewählt oder den Speicherort für diese Datei ausgewählt haben.
Alles, was wir von der Anwendung benötigen, ist die Anzeige von Bildern. Mit der Eigenschaft allowedFileTypes können wir bestimmen, welche Dateitypen das Bedienfeld auswählen kann. Es nimmt einen Wert vom Typ NSArray an . Wir erstellen ein JS-Array mit gültigen Typen, müssen es jedoch noch in NSArray konvertieren . Dies geschieht folgendermaßen: $ (allowdTypes) . Dies ist eine andere Möglichkeit, die Brücke zu benutzen. Mit dieser Methode übersetzen wir einen JS-Wert in Objective-C. Der umgekehrte Vorgang sieht folgendermaßen aus : $ (ObjCThing) .js .
Öffnen Sie das Panel mitpanel.runModal . Die Codeausführung wird angehalten. Wenn Sie auf Abbrechen oder Öffnen klicken , gibt das Bedienfeld einen Wert zurück. Wenn die Schaltfläche Öffnen gedrückt wird , wird die Konstante $ .NSOKButton zurückgegeben .
Die folgende Anmerkung zu panel.URLs ist sehr wichtig. In JS erfolgt der Zugriff auf Array-Werte folgendermaßen: array [0] . Da URLs vom Typ NSArray sind , können Sie keine eckigen Klammern verwenden. Verwenden Sie stattdessen die Methode objectAtIndex . Das Ergebnis wird dasselbe sein.
Nach Erhalt der Image-URL können Sie eine neue Instanz von NSImage erstellen. Da das Erstellen eines Bildes mithilfe einer Datei-URL ein weit verbreiteter Ansatz ist, gibt es hierfür eine praktische Methode:
initByReferencingFile
NSImageView wird auf dieselbe Weise erstellt, wie wir es zum Erstellen anderer Benutzeroberflächenelemente verwendet haben. imgView steuert die Bildanzeige.
Wir müssen die Größe des Fensters an die Breite und Höhe des Bildes anpassen, ohne die unteren Grenzen von Höhe / Breite zu verlassen. Verwenden Sie setFrameDisplay , um die Fenstergröße zu ändern .
Daher haben wir das Bild für imageView festgelegt und es dem Fenster hinzugefügt. Da sich Breite und Höhe geändert haben, muss das Fenster zentriert werden.
Und hier ist unsere kleine Anwendung. Mach weiter, öffne ein paar Dateien. Und ja, animierte Gifs funktionieren auch, also vergiss sie nicht.

Herzhafte Nachrichten


Bisher haben Sie die Anwendung auf opt + cmd + r ausgeführt . Sie starten jedoch eine reguläre Anwendung, indem Sie auf das Symbol doppelklicken.

Doppelklicken Sie auf das Symbol, um die Anwendung

zu starten.Das Symbol kann durch Ersetzen von /Contents/Resources/applet.icns geändert werden . Um auf die Anwendungsressourcen zuzugreifen, klicken Sie mit der rechten Maustaste auf das Symbol und wählen Sie "Paketinhalt anzeigen".

Warum war ich so aufgeregt?


Weil ich denke, dass es ein großes Potenzial gibt. Deshalb. Wenn Yosemite herauskommt, kann sich jeder hinsetzen und eine native Anwendung schreiben. Und sie können es mit einer der gebräuchlichsten Programmiersprachen tun. Sie müssen nichts herunterladen oder installieren. Auch Xcode muss nicht installiert werden, wenn Sie dies nicht möchten. Die Eintrittsschwelle wird stark gesenkt. Das ist unglaublich.
Ich weiß, dass das Entwickeln von Anwendungen für OS X viel komplizierter ist als das Schreiben eines Skripts auf den Knien. Ich habe keine Illusionen, dass JavaScript zum De-facto-Standard für den Beginn der Entwicklung für Mac wird. Ich glaube, dass dies Entwicklern helfen wird, kleine Anwendungen zu schreiben, die die Entwicklung für sich und andere Menschen erleichtern. Haben Sie jemanden im Team, der Schwierigkeiten hat, mit der Befehlszeile zu arbeiten? Schreiben Sie eine schnelle GUI dafür. Benötigen Sie eine Möglichkeit, Konfigurationen schnell oder visuell zu erstellen oder zu ändern? Machen Sie dafür einen kleinen Antrag.
Andere Sprachen haben auch diese Funktionen. Python und Ruby haben Zugriff auf dieselben nativen APIs, und Benutzer erstellen Anwendungen, die sie verwenden. Die Verwendung von JavaScript ist jedoch anders. Dies stellt alles auf den Kopf. Als würden die DIY-Prinzipien der Webentwicklung unter Desktop an die Tür der Entwicklung klopfen. Apple hat die Tür unverschlossen gelassen, ich gehe hinein.

Anmerkung des Übersetzers:
* - Mutter hat das Wort allgemeinen Sprachgebrauch wird, zum Beispiel zu unterscheiden HTML5-Anwendungen und traditionell
** - Bleiben Sie offen nach run - Handler, nicht sicher , wie es in der russischen Version von Setup - Editor Script aufgerufen wird
*** - Message Passing

Jetzt auch beliebt: