2016-11-30 23 views
-2

更新されていない進行状況バーに問題があります(灰色になります)。私が使用して(MainViewController.m内部)クラスの中から、それを呼び出すとiOSの進行状況バーが更新されない

- (void)setProgress:(float)prog { 

    NSLog(@"Progressbar updated, value %f", prog); 
    self.progressBar.progress = prog; 
} 

// in MainViewController.m 

[self setProgress:1.0]; 

すべてが素晴らしい働いている、私はMainViewController.mでプログレスバーを更新するには、このメソッドを得ましたバーは青色の進捗状況を示し、NSLog出力は値を取得します。

このプログレスバーを使用すると、別のクラス(processing.m)で実行されるループで処理を視覚化し、MainViewControllerに進行状況を示すメッセージを送信します。プロトコルを使用しています:

#import "progressProtocol.h" 

@interface MainViewController : UIViewController <progressProtocol> 
- (void)setProgress:(float)prog; 

@end 

とprocessing.mで:

// in processing.m 
[self.delegate setProgress:1.0]; 

記載私は唯一の正しい値とのNSLog出力を取得するプロトコルを介してメッセージを送信することによってでsetProgressメソッドを呼び出すが、プログレスバーが移動していません値に!?メソッドの中にブレークポイントを設定すると、メソッドが呼び出されていることがわかりますが、プログレスバーは動いていません。

ループの中で、私はいくつかの時間について新しい値でメッセージを送信していますが、進捗バーには何も変更されていません。正しい値のNSLogだけです。何か案が?

+2

あなたは、プロトコルとそれを呼び出すprog' 'の値が何であるかを確認してください。 – Frankie

+5

バーはメインスレッドで更新されていますか?それはする必要があります。 – vadian

+0

@Frankie:私はNSLogもprog NSLog(@ "Progressbar updated、value%f"、prog);の値を出力させて、値が正しいことを伝えさせました! – Hecot

答えて

2

あなたは、メインスレッド上で、このような何かをやっているように聞こえる:動作しません

int steps = 10000 
for (int step = 1; x < steps; x++) { 
    //Do something time-consuming that takes a few seconds. 
    viewController.setProgress((float)step/(float)steps) 
} 

iOSでのUI更新は、コードが返ってイベントループにアクセスしたときにのみ行われます。

あなたは、メインスレッド上で時間のかかる作業を行い、それが行われるまで戻らないループを持っている場合は、プログレスインジケータを更新するために、あなたのコードはUIを更新する機会を得ることはありません。

代わりに、あなたはおそらくバックグラウンドスレッドで時間のかかる仕事をするためにあなたのコードを書く必要があります。

//Run the time-consuming loop on a background queue 
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), 
^{ 
    int steps = 10000 
    for (int step = 1; x < steps; x++) { 
     //Do something time-consuming that takes a few seconds. 

     //As the loop progresses, send a message to update the progress 
     //indicator to the main thread. 
     dispatch_async(dispatch_get_main_queue(), 
     ^{ 
     viewController.setProgress((float)step/(float)steps) 
     } 
    } 
    } 
+0

あなたのスキームに合わせて設定しましたが、プログレスバーは今更新されていますが、特定の割合の処理がクラッシュした後、 'malloc:***オブジェクトのエラー0x1008b6a00:解放されたオブジェクトのチェックサムが正しくありません解放された後に変更された。処理はうまくいきました。クラッシュを引き起こす原因をどこから探すか考えていますか? – Hecot

+0

マルチスレッドプログラミングに関連するさまざまな可能性があります。長時間実行されているプロセスがまだ実行されている間に、何かがリリースされるようなことは私には聞こえます。長いコードが何をしているのかを説明して、最後に新しいコードで質問を更新してください。 –

関連する問題