只有NSSavePanel的Cocoa应用程序

时间:2012-04-11 13:25:21

标签: objective-c cocoa

我正在尝试创建一个显示SavePanel的Cocoa应用程序,在用户选择文件后,它会在stdout上打印它。我完全用Objective-C和Cocao开始了。问题是它不带键盘输入,只能用鼠标选择文件。

这是代码:

#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 个答案:

答案 0 :(得分:1)

AppKit / Cocoa类需要初始化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在下面的评论的说法,这不是你真正编写Cocoa应用程序的方式,虽然它确实会使你的直接问题消失,但它并不是一个完整或完全正确的解决方案。要扩展Daniel的评论,并轻松开始,请创建一个新的Cocoa应用程序项目。打开应用程序委托类(为您创建),并将代码放在-applicationDidFinishLaunching:方法中。正如其名称所暗示的那样,该方法在应用程序完成启动后调用,并且所有内容都设置为可以正常使用AppKit类。随着您获得更多经验,您将更好地理解典型的Cocoa应用程序架构,并可以继续创建用户界面等。