cocoa – 如何防止NSButton在禁用时注册印刷机?

cocoa – 如何防止NSButton在禁用时注册印刷机?,第1张

概述新手警告 尝试禁用NSButton时,我有一个简单但令人烦恼的问题.以下是用于说明问题的示例代码: - (IBAction)taskTriggeredByNSButtonPress:(id)sender {[ibOutletToNSButton setEnabled:NO];//A task is performed here that takes some time, during whic 新手警告

尝试禁用NSbutton时,我有一个简单但令人烦恼的问题.以下是用于说明问题的示例代码:

- (IBAction)taskTriggeredByNSbuttonPress:(ID)sender {[ibOutletToNSbutton setEnabled:NO];//A task is performed here that takes some time,during which time//the button should not respond to presses.//Once the task is completed,the button should become responsive again.[ibOutletToNSbutton setEnabled:YES];}

这是我观察到的.我按下按钮.按钮变为禁用(通过其褪色外观判断),任务开始执行.当按钮被禁用并且任务正在执行时,我再次按下按钮.没有任何事情立即发生,但是一旦任务完成,第二次调用taskTriggeredByNSbuttonPress:方法,建议第二次按下按钮被置于保持状态,然后在按钮重新启用后激活.

我已经尝试过各种黑客来防止第二次按键被识别,包括在[ibOutletToNSbutton setEnabled:NO]之后引入时间延迟;声明,使按钮隐藏而不是禁用,在应该禁用的时间内用自定义视图覆盖按钮,将按钮的启用状态绑定到属性,以及其他我不好意思提及的事情.

请帮助我理解为什么我无法完成禁用按钮工作的简单任务.

解决方法 这个方法似乎与按钮直接相关.您应该在另一个线程上执行长 *** 作,否则在方法返回之前,主runloop将不可用.主runloop在事件不可用时不响应事件.

首先,创建一个方法:

- (voID)someLongTask: (ID)sender {    // Do some long tasks…    // Now re-enable the button on the main thread (as required by Cocoa)    [sender performSelectorOnMainThread: @selector(setEnabled:) withObject: YES waitUntilDone: NO];}

然后,在单击按钮时在单独的线程中执行该方法:

- (IBAction)buttonPushed: (ID)sender {    [sender setEnabled: NO];    [self performSelectorInBackground: @selector(someLongTask) withObject: nil];}

您可以在上面的示例中将self替换为-someLongTask所在的对象.

通过多线程,您可以单独保持主runloop稳定.也许,你的问题将得到解决.否则,您解决了响应问题.

(顺便说一句,如果只通过按钮调用方法,则将sender参数设置为按钮.这样,您不需要在方法中使用插座.但这只是一个提示.)

总结

以上是内存溢出为你收集整理的cocoa – 如何防止NSButton在禁用时注册印刷机?全部内容,希望文章能够帮你解决cocoa – 如何防止NSButton在禁用时注册印刷机?所遇到的程序开发问题。

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

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存