objective-c – 如何在不调用NSApplication或NSRunLoop的情况下运行Cocoa GUI类

objective-c – 如何在不调用NSApplication或NSRunLoop的情况下运行Cocoa GUI类,第1张

概述为什么以下代码有效?这是一个小型 Cocoa程序,它使用NSOpenPanel选择文件并在Emacs.app中打开它.它可以从命令行运行,并以起始目录作为参数. NSOpenPanel如何在不调用NSApplication或NSRunLoop的情况下运行?没有显式启动NSApplication或NSRunLoop的Cocoa程序有哪些限制?我原以为其中一个是:你不能使用任何类型的GUI.也许通过调 为什么以下代码有效?这是一个小型 Cocoa程序,它使用NSOpenPanel选择文件并在Emacs.app中打开它.它可以从命令行运行,并以起始目录作为参数.

NSOpenPanel如何在不调用NSApplication或NSRunLoop的情况下运行?没有显式启动NSApplication或NSRunLoop的Cocoa程序有哪些限制?我原以为其中一个是:你不能使用任何类型的GUI.也许通过调用NSOpenPanel,调用一些调用NSRunLoop的后备代码?我在[NSApplication alloc]和[NSRunLoop alloc]上放置了断点,但它们没有被触发.

main.m:#import <Cocoa/Cocoa.h>Nsstring *selectfileWithStartPath(Nsstring *path) {  Nsstring *answer = nil;  NSOpenPanel* panel = [NSOpenPanel openPanel];  panel.allowsMultipleSelection = NO;  panel.canChoosefiles = YES;  panel.canChooseDirectorIEs = NO;  panel.resolvesAliases = YES;  if([panel runModalForDirectory:path file:nil] == NSOKbutton)    answer = [[[panel URLs] objectAtIndex:0] path];  return answer;}int main(int argc,const char * argv[]) {  Nsstring *startPath = argc > 1 ? [Nsstring stringWithUTF8String:argv[1]] : @"/Users/Me/Docs";  printf("%s\n",argv[1]);  BOol isDir;  if([[NSfileManager defaultManager] fileExistsAtPath:startPath isDirectory:&isDir] && isDir) {    system([[Nsstring stringWithFormat:@"find %@ -name \*~ -exec rm {} \;",startPath] UTF8String]);    Nsstring *file = selectfileWithStartPath(startPath);    if(file) [[NSWorkspace shareDWorkspace] openfile:file withApplication:@"Emacs.app"];  }}
解决方法 runModalForDirectory:file:types:创建并运行自己的事件循环.
从文档:

displays the panel and begins a modal event loop that is terminated
when the user clicks either OK or Cancel.

如果在“打开”对话框处于活动状态时暂停程序,也可以看到
并在调试器控制台中打印堆栈回溯:

frame #0: 0x00007fff8b855a1a libsystem_kernel.dylib`mach_msg_trap + 10frame #1: 0x00007fff8b854d18 libsystem_kernel.dylib`mach_msg + 64frame #2: 0x00007fff8549f155 CoreFoundation`__CFRunLoopServiceMachPort + 181frame #3: 0x00007fff8549e779 CoreFoundation`__CFRunLoopRun + 1161frame #4: 0x00007fff8549e0b5 CoreFoundation`CFRunLoopRunspecific + 309frame #5: 0x00007fff88381a0d HIToolBox`runcurrentEventLoopInMode + 226frame #6: 0x00007fff883817b7 HIToolBox`ReceiveNextEventCommon + 479frame #7: 0x00007fff883815bc HIToolBox`_BlockUntilNextEventMatchingListInModeWithFilter + 65frame #8: 0x00007fff838ca3de AppKit`_DPSNextEvent + 1434frame #9: 0x00007fff838c9a2b AppKit`-[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:] + 122frame #10: 0x00007fff83c28e2e AppKit`-[NSApplication _realDoModalLoop:peek:] + 642frame #11: 0x00007fff83c2754e AppKit`-[NSApplication runModalForWindow:] + 117frame #12: 0x00007fff83ef5d0b AppKit`-[NSSavePanel runModal] + 276frame #13: 0x0000000100000c61 xxx`selectfileWithStartPath(path=0x00000001000010b8) + 225 at main.m:18frame #14: 0x0000000100000e0d xxx`main(argc=1,argv=0x00007fff5fbff9c0) + 189 at main.m:26

正如您在第11帧中所看到的,-[NSApplication runModalForWindow:]用于运行模态“打开”对话框的事件循环.

总结

以上是内存溢出为你收集整理的objective-c – 如何在不调用NSApplication或NSRunLoop的情况下运行Cocoa GUI类全部内容,希望文章能够帮你解决objective-c – 如何在不调用NSApplication或NSRunLoop的情况下运行Cocoa GUI类所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/web/1004875.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存