20

私は iOS 開発に不慣れで、タイマーを実行するための単純な目的 -c クラス "MoneyTimer.m" を持っています。そこから、タイマーの値を変更して UI ラベルを更新したいと考えています。非 UI スレッドから UI 要素にアクセスする方法を知りたいですか? Xcode 4.2 とストーリーボードを使用しています。

ブラックベリーでは、イベント ロックを取得するだけで、非 UI スレッドから UI を更新できます。

//this the code from MyTimerClass

 {...
    if(nsTimerUp == nil){

        nsTimerUp = [NSTimer scheduledTimerWithTimeInterval: 1.0 target:self selector:@selector(countUpH) userInfo:nil repeats: YES];
 ...}

(void) countUpH {

sumUp = sumUp + rateInSecH;
 **//from here i want to update the UI label **
...
}
4

5 に答える 5

34

これが最も迅速で簡単な方法です。

- (void) countUpH{

   sumUp = sumUp + rateInSecH;
   //Accessing UI Thread
   [[NSOperationQueue mainQueue] addOperationWithBlock:^{

      //Do any updates to your label here
      yourLabel.text = newText;

   }];
}

このようにすれば、別の方法に切り替える必要はありません。

お役に立てれば。

サム

于 2012-06-28T10:33:04.760 に答える
3

適切な方法は次のとおりです。

- (void) countUpH  {
   sumUp = sumUp + rateInSecH;
   //Accessing UI Thread
   dispatch_async(dispatch_get_main_queue(), ^{

   //Do any updates to your label here
    yourLabel.text = newText;
   });
}
于 2015-03-23T03:02:13.350 に答える
3

あなたの質問は多くの情報や詳細を提供していないため、何をする必要があるかを正確に知ることは困難です (たとえば、「スレッド」の問題があるかどうかなど)。

いずれにせよ、MoneyTimer インスタンスが使用できる現在の viewController への参照を持っていると仮定しますperformSelectorOnMainThread

///

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
于 2012-06-28T10:18:18.637 に答える
2

過去に同じようなことをしたことがあります。

関数を使用してラベル テキストを設定しました。

- (void)updateLabelText:(NSString *)newText {
    yourLabel.text = newText;
}

次に、 performSelectorOnMainThreadを使用してメインスレッドでこの関数を呼び出しました

NSString* myText = @"new value";
[self performSelectorOnMainThread:(@selector)updateLabelText withObject:myText waitUntilDone:NO];
于 2012-06-28T10:25:51.683 に答える
1

そのラベルが同じクラスにあると仮定します。

    if(nsTimerUp == nil){
        nsTimerUp = [NSTimer scheduledTimerWithTimeInterval: 1.0 target:self selector:@selector(countUpH) userInfo:nil repeats: YES];
    [self performSelectorOnMainThread:@selector(updateLabel)
                                           withObject:nil
                                        waitUntilDone:NO];

    }

-(void)updateLabel {
    self.myLabel.text = @"someValue";
}
于 2012-06-28T10:29:57.673 に答える