ボタンを押すと開始する単純な進行状況バーである Cocoa アプリケーションを実装しています。
状況: ボタンを押すと、アニメーションが開始および停止していることがわかりますが、プログレス バーの値が更新されません。
ここに記載されている解決策も試しましたが、うまくいきません:
長時間実行中のループ中に Cocoa の進行状況バーを更新するにはどうすればよいですか?
ソースコードのどこに問題があるかを誰かが教えてくれますか?
これが私の情報源です。
SimpleProgressBar.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
SimpleProgressBar.h
#import < Foundation/Foundation.h >
@interface SimpleProgressBar : NSObject{
__weak NSProgressIndicator *progressBar;
}
@property (weak) IBOutlet NSProgressIndicator *progressBar;
-(IBAction)startProgressBar:(id)sender;
@end
役立つ回答をありがとうございました。
アップデート:
これがソリューションからの移植であり、機能しません:
SimpleProgressBar.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);
}