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 应用程序架构,并可以继续创建用户界面等。