带有用户界面的命令行工具

时间:2011-10-31 12:50:58

标签: cocoa

我创建了一个命令行工具。我的项目几乎完成了,但现在我需要创建一个用户界面来询问用户凭据。 是否可以在我的命令行项目中添加一个窗口,或者我必须创建一个cocoa应用程序来执行此操作?

3 个答案:

答案 0 :(得分:1)

命令行工具不会与窗口服务器建立连接(由NSApplication完成),因此不能创建窗口。如果你出于任何原因需要显示一个窗口,那么它可能应该是一个应用程序,所以你应该使用它并将其设置为一个。

答案 1 :(得分:0)

Cocoa App可行。我没有使用Tcl / Tk或MacRuby,但如果你是Cocoa的新手,你可能会更容易接受它们。

如果不使用AppKit API,则无法在AppleScript中执行此操作;见Prompt user for password with dialog window when using sudo

如果您真的在问Xcode问题,可能需要重新发布更具体的内容,例如“如何转换我的命令行项目,以便添加Cocoa窗口。”

答案 2 :(得分:0)

Yea Peter是正确的,您应该将其放入应用程序中,但这并不意味着您需要将该工具转换为Cocoa应用程序,可以通过利用NSApplication类使命令行工具与UI保持活动状态,但不能使用NSApplicationMain()启动它。但是在您的情况下,我认为这不是必需的方法,但是无论如何,这就是我在命令行工具中显示窗口的方式:

@interface CustomAppClass : NSApplication
    @property (strong) NSWindow *theWindow;
@end
@implementation CustomAppClass {
    BOOL terminate;
}

- (void)finishLaunching {
    /* Draw windows and stuff */
    self.theWindow = [[NSWindow alloc] initWithContentRect:NSMakeRect(0, 0, 300, 200) styleMask:NSWindowStyleMaskTitled | NSWindowStyleMaskClosable | NSWindowStyleMaskMiniaturizable | NSWindowStyleMaskResizable backing:NSBackingStoreBuffered defer:NO];
    [self.theWindow setTitle:@"Why Hello There!"];
    [self.theWindow center];
    [self.theWindow makeKeyAndOrderFront:self.theWindow];
}

// Override run and terminate: methods
- (void)run {
    terminate = NO;
    [self finishLaunching];
    do {
        NSEvent *event = [self nextEventMatchingMask:NSAnyEventMask untilDate:[NSDate distantFuture] inMode:NSDefaultRunLoopMode dequeue:YES];
        [self sendEvent:event];
        [self updateWindows];
    } while (!terminate);
}
- (void)terminate:(id)sender {
    terminate = YES;
}

@end


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

    // Do all your pre functions here

    /* Make NSApplication from CustomAppClass */
    CustomAppClass *appObject = [CustomAppClass sharedApplication];
    if ([appObject respondsToSelector:@selector(run)]) {
        [appObject performSelectorOnMainThread:@selector(run) withObject:nil waitUntilDone:YES];
    }

    // Do all your post functions here.

    return 0;
}

抱歉,我没有描述如何要求提供凭据和东西,但是如果您要基于官方窗口的身份验证(而不是sudo),则应该考虑使用安全框架。

部分功劳归于https://www.cocoawithlove.com/2009/01/demystifying-nsapplication-by.html

希望这对您有帮助。