2012-04-11 2 views
2

SavePanel을 표시하는 Cocoa 응용 프로그램을 만들려고합니다. 사용자가 파일을 선택하면 표준 출력에 인쇄됩니다. 나는 Objective-C와 Cocao의 총 초보자입니다. 문제는 키보드 입력을받지 않는다는 것인데, 마우스로 파일을 선택하는 것만 가능합니다.NSSavePanel 만있는 코코아 응용 프로그램

#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

코코아를 배우는 것이 목표라면 코코아 응용 프로그램부터 시작하십시오. 목표가 실제 UI를 쉘 스크립트와 통합하려고 시도하는 경우 문제를 해결하고 실제 응용 프로그램에서 쉘 기능을 래핑하십시오. UI를 커맨드 라인 기반의 워크 플로우와 통합하려는 많은 시도를 보았고, 그들은 대단히 끔찍했습니다. – bbum

답변

1

AppKit의가/코코아 클래스는 NSApplication 객체 (다른 것들 중에서) 사용자 입력을 처리하기 위해 초기화 될 필요 :

코드이다. 모든 응용 프로그램이 정확히 하나 개의 인스턴스가 있어야합니다

:

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; 
} 
이에 대한

상세 정보는 documentation for NSApplication에서 발견 특히 이러한 점 할 수 있습니다 주요 기능의 상단에이 줄을 추가하면 트릭을 할해야 NSApplication (또는 NSApplication의 하위 클래스). 프로그램의 main() 함수는 이 인스턴스를 만들려면 sharedApplication 클래스 메서드를 호출해야합니다.
NSApplication은 윈도우 서버에서 이벤트를 수신하여 적절한 NSResponder 객체에 배포하는 중요한 작업을 수행합니다. NSApp는 이벤트를 NSEvent 객체로 변환 한 다음 NSEvent 객체를 영향을받는 NSWindow 객체로 전달합니다. bbum 아래 danielpunkass의 의견의 라인을 따라

, 이것은 정말 코코아 응용 프로그램을 작성하려는 방법이 아니다, 그것은 즉각적인 문제는 멀리 갈 수 있도록 않지만, 그것은 완전한 또는 완전히 올바른 해결책이 아니다 . Daniel의 의견을 확대하고 쉽게 시작할 수 있도록 새로운 Cocoa 응용 프로그램 프로젝트를 만듭니다. 응용 프로그램 대리자 클래스 (사용자를 위해 생성됨)를 열고 코드를 -applicationDidFinishLaunching: 메서드에 넣습니다. 이름에서 알 수 있듯이이 메소드는 응용 프로그램 실행이 완료된 후에 호출되며 AppKit 클래스를 정상적으로 사용할 수 있도록 모든 것이 설정됩니다. 더 많은 경험을 쌓으면 일반적인 Cocoa 응용 프로그램 아키텍처를 더 잘 이해하고 사용자 인터페이스 등을 만들 수 있습니다.

+2

올바른 경로에 있지만 최상위 수준의 NSApplication을 설정하는 것만으로는 충분하지 않습니다. 예상대로 작동하려면 응용 프로그램의 주 스레드 실행 루프를 실행해야합니다. 어쨌든 "이 일을하라"는 노력은 잘못된 압정입니다. 질문자는 Xcode의 기본적인 새로운 "코코아 애플리케이션"템플릿부터 학습에 접근해야하며, 실험을위한 애플리케이션 위임 클래스에 중점을 둡니다. – danielpunkass

+0

이것은 완전한 해결책이 될 것 같지 않았지만 최소한 내 컴퓨터 (10.7.3)에서는이 간단한 경우에 효과가 있습니다. 즉, @bbum과 danielpunkass는 내가 가진 것보다 더 많은 경험과 지식을 갖고 있으며, 그들이 말하는 것에 대해 알고 있습니다. –

+0

전적으로 동의합니다. 나에게 이것이 효과적이라는 것은 흥미 롭다. 그러나 실제로는 실제 응용 프로그램에서는 이것을 사용하지 않을 것이다. 나는 내 대답을 더 많이 편집했다. –

관련 문제