objective-c – 显示上下文NSMenu而不阻塞主线程

objective-c – 显示上下文NSMenu而不阻塞主线程,第1张

概述显示上下文NSMenu时,我有一些意想不到的结果.我自己展示菜单,而不是使用NSResponder的菜单属性.事实证明,呈现NSMenu是一种阻止 *** 作. 在新的模板项目中,我只在applicationDidLaunch中添加了以下代码: NSMenu *menu = [[NSMenu alloc] initWithTitle:@"Menu"];[menu addItemWithTitle:@"I 显示上下文NSMenu时,我有一些意想不到的结果.我自己展示菜单,而不是使用NSResponder的菜单属性.事实证明,呈现NSMenu是一种阻止 *** 作.

在新的模板项目中,我只在applicationDIDLaunch中添加了以下代码:

NSMenu *menu = [[NSMenu alloc] initWithTitle:@"Menu"];[menu addItemWithTitle:@"Item 1" action:@selector(selected:) keyEquivalent:@""];[menu addItemWithTitle:@"Item 2" action:@selector(selected:) keyEquivalent:@""];[menu addItemWithTitle:@"Item 3" action:@selector(selected:) keyEquivalent:@""];[menu popUpMenupositioningItem:[menu itemAtIndex:0]                     atLocation:CGPointMake(500,500)                         inVIEw:nil];NSLog(@"Context menu shown.");

popUpMenupositioningItem:atLocation:inVIEw:调用在我选择项目或单击外部以自动关闭菜单之前不会返回.仅在菜单关闭后才会打印日志.

为什么会这样?我该如何预防呢?我发现了一些关于这个问题的提及,但“解决方案”总是包括在后台执行其他事情,而不是阻止NSMenu阻塞.

编辑:

如果我在后台线程中显示菜单,则菜单变得无响应,不会对内部或外部的点击做出反应.

dispatch_async(dispatch_get_global_queue(disPATCH_QUEUE_PRIORITY_BACKGROUND,0),^{    [[menu popUpMenupositioningItem:[menu itemAtIndex:0]                          atLocation:CGPointMake(500,500)                              inVIEw:nil];});
解决方法 我不认为你所要求的是可能的,但是,你可以做一些看起来相似的东西:

1)使用NSPopover而不是菜单.这是异步的,旨在用于可以使用d出菜单的许多上下文中.如果您需要支持没有d出框的 *** 作系统版本,您也可以随时创建一个带有按钮的NSWindow.

2)如果您正在尝试运行计时器或在运行循环上安排的其他 *** 作(例如下载),您可以在NSEventTrackingRunLoopMode中安排这些 *** 作.默认情况下,它们仅安排用于NSDefaultRunLoopMode(这是有道理的,因为当计时器触发显示警报时,您不希望取消用户的菜单选择).

说实话,你想要做的事情似乎有点无意义,令人困惑,倒退和滥用菜单.但那可能只是因为我不知道你想要实现的目标.你的高级任务是什么?为什么在菜单启动时需要在主线程上发生什么.难道你不能在第二个线程上发生其他事情(在你的例子中是NSLog())并将菜单留在主线程上吗?

总结

以上是内存溢出为你收集整理的objective-c – 显示上下文NSMenu而不阻塞主线程全部内容,希望文章能够帮你解决objective-c – 显示上下文NSMenu而不阻塞主线程所遇到的程序开发问题。

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

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

原文地址: http://outofmemory.cn/web/1072178.html

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

发表评论

登录后才能评论

评论列表(0条)

保存