0

私は iOS 開発に不慣れで、ここで何が起こっているのかを理解しようとしています。複数のViewControllerとクラスを持つタブバーアプリケーションがあります。私のクラスの 1 つが呼び出され、正常に動作する uilabels を更新します。次に、別のクラスが呼び出され、同じ ViewController 上の他のいくつかの uilabel を更新することを目的としたバックグラウンド ループも実行されます。それらはループからの最初のエントリで 1 回更新されますが、ループがバックグラウンドで実行されている間は更新されません。NSLog を使用して出力をログに記録しているため、ループがまだ実行されており、詳細が変化していることがわかります。

ViewController は回転もサポートします。画面を回転すると、ループ内の数値が uilabel に描画され、画面を再度回転するまで固定されます。つまり、ループを 5 にカウントしてからリセットするように設定すると、ループ I 回転画面は、1 から 5 までのどの数字が uilabel に描画されるかによって異なります。

単一の ViewController アプリケーションでは、これは正常に機能しており、ループが実行され、期待どおりに uilabels がライブで更新されます。

uilabels を更新するクラスは [super viewDidLoad] から呼び出されます。

ありがとう

これがループのあるクラスです:-

 + (void)Loop:(FirstViewController *)vc

 {
 NSLog(@"start");


    static NSUInteger counter1 = 0;
    NSLog(@"with count %d", counter1);

    counter1++;
    NSLog(@"count ++ %d", counter1);

    NSString *label01 = [NSString stringWithFormat: @"%d", counter1];

    //update uilabel
    vc.cha01.text = label01;

            if (counter1 >= 5) {

                            counter1 = 0;

                            }


      // run loop with 1 second delay
      [self performSelector:@selector(Loop:) withObject:nil afterDelay:1];

    }
4

1 に答える 1

1

ループが間違っています。最初に viewController を渡しますが、呼び出すときに をperformSelector:withObject:afterDelay:渡しnilます。

したがって、vcパラメーターは になります。パラメーターをnil渡すだけです。vc

   // run loop with 1 second delay
  [self performSelector:@selector(Loop:) withObject:vc afterDelay:1];

ヒントとして、カスタム オブジェクトを使用してデータを保持- (void)viewDidAppear:(BOOL)animatedし、値を読み込んでラベルを設定する必要があります。UIViewControllerをアンロードしてメモリを解放することができますが、これによりコードで問題が発生する可能性があります。

MVCソリューションを使用するだけで、データ、ケースの文字列を保持するモデルになります。UIViewController次に、MVC のコントローラーである de に、MVC のビュー部分であるラベルを設定します。


ビューが読み込ま-(void)viewDidLoadれると、再度呼び出されることはありません。これは、 内のすべてのビューに当てはまりますUITabBarController

ラベルを更新するコードを- (void)viewDidAppear:(BOOL)animatedメソッドに移動する必要があります。

于 2013-04-09T15:03:01.207 に答える