2

我正在尝试创建一个显示 SavePanel 的 Cocoa 应用程序,并且在用户选择文件后,它会在标准输出上打印它。我是 Objective-C 和 Cocoo 的初学者。问题是它不需要键盘输入,只能用鼠标选择文件。

这是代码:

#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;
}
4

1 回答 1

1

AppKit/Cocoa 类需要初始化一个 NSApplication 对象以处理用户输入(除其他外)。将此行添加到 main 函数的顶部应该可以解决问题:

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;
}

有关这方面的更多信息,请参阅NSApplication 的文档,特别是以下几点:

每个应用程序必须只有一个 NSApplication 实例(或 NSApplication 的子类)。你的程序的 main() 函数应该通过调用 sharedApplication 类方法来创建这个实例。
NSApplication 执行从窗口服务器接收事件并将它们分发给适当的 NSResponder 对象的重要任务。NSApp 将事件转换为 NSEvent 对象,然后将 NSEvent 对象转发给受影响的 NSWindow 对象。

按照下面 bbum 和 danielpunkass 的评论,这不是您真正编写 Cocoa 应用程序的方式,虽然它确实使您的直接问题消失了,但它不是一个完整或完全正确的解决方案。要扩展 Daniel 的评论并让您轻松入门,请创建一个新的 Cocoa 应用程序项目。打开应用程序委托类(为您创建),并将您的代码放入-applicationDidFinishLaunching:方法中。正如其名称所暗示的那样,该方法在应用程序完成启动后调用,并且一切都已设置好,以便您可以正常使用 AppKit 类。随着您获得更多经验,您将更好地了解典型的 Cocoa 应用程序架构,并可以继续创建用户界面等。

于 2012-04-11T15:11:59.563 回答