我正在尝试创建一个显示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;
}
答案 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应用程序架构,并可以继续创建用户界面等。