2012-04-11 4 views
2

Ich versuche, eine Cocoa-Anwendung zu erstellen, die SavePanel anzeigt, und nachdem der Benutzer die Datei ausgewählt hat, druckt es auf stdout. Ich bin Anfänger mit Objective-C und Cocao. Problem ist, dass es keine Tastatureingabe benötigt, es ist nur möglich, eine Datei mit der Maus auszuwählen.Cocoa-App mit nur NSSavePanel

Dies ist der Code:

#import <Cocoa/Cocoa.h> 
#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    NSSavePanel *sPanel = [NSSavePanel savePanel]; 
    int result = [sPanel runModal]; 
    if (result == NSOKButton) { 
     NSString * filename = [sPanel filename]; 
     char * fileStr = [filename UTF8String]; 
     printf("%s\n", fileStr); 
    } 
    return 0; 
} 
+1

Wenn es das Ziel ist, Kakao zu lernen, beginnen Sie mit einer Cocoa-Anwendung. Wenn das Ziel darin besteht, die tatsächliche Benutzeroberfläche mit einem Shell-Skript zu integrieren, sollten Sie das Problem umgehen und die Shell-Funktionalität in eine echte App integrieren. Ich habe viele Versuche gesehen, UI mit einem Befehlszeilen-basierten Workflow zu integrieren, und sie waren allgemein schrecklich. – bbum

Antwort

1

Die AppKit/Cocoa-Klassen erfordern ein NSApplication Objekt, um initialisiert werden Benutzereingaben (unter anderem) zu behandeln. Addiert man diese Linie an die Spitze Ihrer Hauptfunktion sollte es tun:

int main(int argc, char *argv[]) 
{ 
    [NSApplication sharedApplication]; // ** Add this ** 

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    NSSavePanel *sPanel = [NSSavePanel savePanel]; 
    int result = [sPanel runModal]; 
    if (result == NSOKButton) { 
     NSString * filename = [sPanel filename]; 
     const char * fileStr = [filename UTF8String]; 
     printf("%s\n", fileStr); 
    } 
    [pool drain]; 
    return 0; 
} 

Weitere Informationen dazu finden Sie in der documentation for NSApplication, insbesondere diese Punkte zu finden:

Jede Anwendung muss genau eine Instanz von NSApplication (oder eine Unterklasse von NSApplication). Die main() -Funktion Ihres Programms sollte diese Instanz erstellen, indem Sie die sharedApplication-Klassenmethode aufrufen.
NSApplication führt die wichtige Aufgabe aus, Ereignisse vom -Fensterserver zu empfangen und sie an die richtigen NSResponder-Objekte zu verteilen. NSApp übersetzt ein Ereignis in ein NSEvent-Objekt und leitet dann das NSEvent-Objekt an das betroffene NSWindow-Objekt weiter.

Nach dem Vorbild der BBUM und danielpunkass Kommentare unten, das ist nicht die Art und Weisen Sie wirklich eine Cocoa-Anwendung schreiben würden, und während es Ihr unmittelbares Problem gehen macht weg, es ist keine vollständige oder vollständig richtige Lösung . Um Daniels Kommentar zu erweitern und um Ihnen den Einstieg zu erleichtern, erstellen Sie ein neues Cocoa-Anwendungsprojekt. Öffnen Sie die Anwendungsdelegiertenklasse (für Sie erstellt) und fügen Sie Ihren Code in die Methode -applicationDidFinishLaunching: ein. Wie es der Name andeutet, wird diese Methode aufgerufen, nachdem die Anwendung gestartet wurde und alles so eingerichtet ist, dass Sie die AppKit-Klassen normal verwenden können. Je mehr Erfahrung Sie sammeln, desto besser verstehen Sie die typische Cocoa-Anwendungsarchitektur und können zum Erstellen von Benutzeroberflächen usw. übergehen.

+2

Dies ist auf dem richtigen Weg, aber es reicht nicht, einfach eine Top-Level-NSApplication einzurichten. Sie müssen die Hauptthread-Ausführungsschleife der Anwendung ausführen, damit die Dinge wie erwartet funktionieren. In jedem Fall sind Bemühungen, "diese Arbeit zu leisten", der falsche Weg. Der Fragesteller sollte sich seinem Lernen nähern, ausgehend von einer grundlegenden neuen "Kakaonutzungs" -Schablone in Xcode, die sich auf die App-Delegiertenklasse zum Experimentieren konzentriert. – danielpunkass

+0

Das schien keine vollständige Lösung zu sein, aber es funktioniert tatsächlich für diesen einfachen Fall, zumindest auf meiner Maschine (10.7.3). Das heißt, @bbum und danielpunkass sind beide erfahrener und erfahrener als ich und wissen, wovon sie reden. –

+0

stimme ich voll und ganz zu. Für mich ist es interessant, dass das funktioniert, aber in Wirklichkeit würden Sie das nie in einer realen Anwendung verwenden. Ich habe meine Antwort mit mehr bearbeitet. –