我正在实现一个 Cocoa 应用程序,它只是一个简单的进度条,当我按下按钮时会启动。
情况是:当我按下按钮时,我可以看到动画是开始和停止,但进度条不会更新值。
我也尝试过这里提到的解决方案,但它不起作用:
How do I update a progress bar in Cocoa during a long running loop?
有人可以帮忙看看我的源代码中的问题在哪里吗?
这是我的来源。
简单进度条.m
#import "SimpleProgressBar.h"
@implementation SimpleProgressBar
@synthesize progressBar;
int flag=0;
-(IBAction)startProgressBar:(id)sender{
if(flag ==0){
[self.progressBar startAnimation:sender];
flag=1;
}else{
[self.progressBar stopAnimation:sender];
flag=0;
}
[self.progressBar displayIfNeeded];
[self.progressBar setDoubleValue:10.0];
int i=0;
for(i=0;i<100;i++){
NSLog(@"progr: %f",(double)i);
[self.progressBar setDoubleValue:(double)i];
[self.progressBar setNeedsDisplay:YES];
}
}
@end
简单进度条.h
#import < Foundation/Foundation.h >
@interface SimpleProgressBar : NSObject{
__weak NSProgressIndicator *progressBar;
}
@property (weak) IBOutlet NSProgressIndicator *progressBar;
-(IBAction)startProgressBar:(id)sender;
@end
非常感谢您提供任何有用的答案。
更新:
这是我从解决方案中移植的内容,但它不起作用:
简单进度条.m
#import "SimpleProgressBar.h"
@implementation SimpleProgressBar
@synthesize progressBar;
int flag=0;
-(IBAction)startProgressBar:(id)sender{
if(flag ==0){
[self.progressBar startAnimation:sender];
flag=1;
}else{
[self.progressBar stopAnimation:sender];
flag=0;
}
[self.progressBar displayIfNeeded];
[self.progressBar setDoubleValue:0.0];
void(^progressBlock)(void);
progressBlock = ^{
[self.progressBar setDoubleValue:0.0];
int i=0;
for(i=0;i<100;i++){
//double progr = (double) i / (double)100.0;
double progr = (double) i;
NSLog(@"progr: %f",progr);
dispatch_async(dispatch_get_main_queue(),^{
[self.progressBar setDoubleValue:progr];
[self.progressBar setNeedsDisplay:YES];
});
}
};
dispatch_queue_t queue = dispatch_get_global_queue(0, 0);
dispatch_async(queue,progressBlock);
}