2013-04-11 2 views
2

obj-c에서 gui 창을 만드는 방법이 있으며, .app 번들은 없으며 extcutable입니까? 문제는 GUI 응용 프로그램 (하나의 대화 상자)이 필요하다는 것입니다.Objective-c 터미널 응용 프로그램에서 GUI 창을 만드는 방법

시도 : 터미널 앱에 appkit.framework를 가져옵니다. - 여러 가지 이유로 충돌합니다. x11을 사용하는 것이 OS X 10.8에 포함되어 있지 않기 때문에 좋은 생각이 아니라고 결정했습니다.

그래서 어떤 아이디어입니까?

+0

질문에 이유를 추가 할 수 있다면 도움이 될 것입니다. –

+0

일반적인 접근법은 "명령 줄 앱"을 앱 번들 내의 실행 파일에 대한 심볼릭 링크로 심볼릭 링크하는 것입니다. Mac OS X 런처/도크에는 번들이 필요합니다. 번들에 문제가 있다면 번들을 사람들이 볼 수 없게 될 것입니다 (예 :/Applications가 아님). 그리고 그 차이점은 무엇입니까? 사람들이 네 물건을 두 번 클릭 할 수 없도록 확실히해야합니까? –

답변

5

슬프게도 NSApplication을 실행해야하지만 앱 번들이 필요하지 않습니다.

프로젝트를 만들 때 유형으로 "Foundation"을 선택해야합니다. 그럼 당신은 이런 식으로 설정할 수 있습니다 :

#import <Foundation/Foundation.h> 
#import <AppKit/AppKit.h> 

@interface MyAppDelegate : NSObject <NSApplicationDelegate> 
{ 
    NSWindow *window; 
} 
@end 

@implementation MyAppDelegate 

-(id) init 
{ 
    self = [super init]; 
    if (self) 
    { 
     // total *main* screen frame size // 
     NSRect mainDisplayRect = [[NSScreen mainScreen] frame]; 

     // calculate the window rect to be half the display and be centered // 
     NSRect windowRect = NSMakeRect(mainDisplayRect.origin.x + (mainDisplayRect.size.width) * 0.25, 
            mainDisplayRect.origin.y + (mainDisplayRect.size.height) * 0.25, 
            mainDisplayRect.size.width * 0.5, 
            mainDisplayRect.size.height * 0.5); 

     /* 
     Pick your window style: 
     NSBorderlessWindowMask 
     NSTitledWindowMask 
     NSClosableWindowMask 
     NSMiniaturizableWindowMask 
     NSResizableWindowMask 
     */ 
     NSUInteger windowStyle = NSTitledWindowMask | NSMiniaturizableWindowMask; 

     // set the window level to be on top of everything else // 
     NSInteger windowLevel = NSMainMenuWindowLevel + 1; 

     // initialize the window and its properties // just examples of properties that can be changed // 
     window = [[NSWindow alloc] initWithContentRect:windowRect styleMask:windowStyle backing:NSBackingStoreBuffered defer:NO]; 
     [window setLevel:windowLevel]; 
     [window setOpaque:YES]; 
     [window setHasShadow:YES]; 
     [window setPreferredBackingLocation:NSWindowBackingLocationVideoMemory]; 
     [window setHidesOnDeactivate:NO]; 
     [window setBackgroundColor:[NSColor greenColor]]; 
    } 
    return self; 
} 

- (void)applicationWillFinishLaunching:(NSNotification *)notification 
{ 
    // make the window visible when the app is about to finish launching // 
    [window makeKeyAndOrderFront:self]; 
    /* do layout and cool stuff here */ 
} 

- (void)applicationDidFinishLaunching:(NSNotification*)aNotification 
{ 
    /* initialize your code stuff here */ 
} 

- (void)dealloc 
{ 
    // release your window and other stuff // 
    [window release]; 
    [super dealloc]; 
} 

@end 


int main(int argc, const char * argv[]) 
{ 

    @autoreleasepool 
    { 
     NSApplication *app = [NSApplication sharedApplication]; 
     [app setDelegate:[[[MyAppDelegate alloc] init] autorelease]]; 
     [app run]; 
    } 
    return 0; 
} 

그 라인 [응용 프로그램 실행]을 염두에 두십시오; 응용 프로그램 루프 내에서 또는 새 스레드 (응용 프로그램 루프 선호)에서 논리를 실행해야하므로 블로킹합니다.

희망이 있습니다.

편집 : 부 .. 너무 늦었습니다!

+0

@Chris Devereux의 답변을 확장하기 만하면,이 작업을 한 후에 실행 루프를 설정할 필요가 없기 때문에 [루프 실행]; 실제로 당신을 위해 실행 루프를 만듭니다. 그 시점에서, 번들이있는 것처럼 앱 *을 거의 처리 할 수 ​​있습니다. – Dario

+1

아우 맨, 첫 번째 대답도 있습니다. 어쨌든 SO에 오신 것을 환영합니다! 대개 질문에 대한 답변이 매우 빠르므로 긴 코드 샘플이 실제로 필요하지 않으면 (또는 나중에 편집 할 때) 긴 코드 샘플을 피하는 것이 좋습니다. –

0

코코아 응용 프로그램을 만들고 필요한 파일을 새 응용 프로그램으로 끌어서 놓기 만하면됩니다. "대상에 추가"및 "대상에 대상 복사 ..."상자를 선택하십시오.

나는 다른 것을 돕기 위해 간단한 작업을 수행하는 이러한 작은 도우미 응용 프로그램을 많이 만들었습니다. 그리고 이것은 대개 내가하는 방식입니다.

+0

내 문제를 이해하지 못했다고 생각합니다. 문제는 .app 번들을 만들 수 없다는 것입니다. 실행 파일에 모든 것을 하드 코딩해야합니다. 하지만 NSApplication은 번들을 다시 요청한다. 그래서 나는 그것을 할 수있는 방법을 찾고 있습니다 & – Maxim

1

.app를 만들지 않고 설명하는 것이 가능해야하지만 AppKit 이벤트 루프를 실행해야합니다 (그렇지 않으면 사용자 입력 이벤트는 어디에서 왔습니까?).

가장 간단한 방법은 공유 NSApplication 객체를 가져 와서 run 메소드를 호출하는 것입니다. nsrunloop을 사용하여 수동으로 이벤트 루프를 설정할 수도 있지만 필요한 입력 소스가 공용 API인지 여부는 확실하지 않습니다.

왜 .app가 필요하지 않습니까? 표준 패턴을 따를 경우 당신이하는 일은 더 쉬울 것입니다.

관련 문제