尝试禁用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在禁用时注册印刷机?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)