2012-06-28 34 views
20

私はiOS開発の初心者です。タイマーを実行するための簡単な目的-cクラス「MoneyTimer.m」があります。そこからUIラベルを更新したいタイマーの変更値。 UI以外のスレッドからUI要素にアクセスする方法を知りたいですか?私はXcode 4.2とストーリーボードを使用しています。iOSの非UIスレッドからUIラベルを更新する方法

ブラックベリーでは、イベントロックを取得するだけで、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 ** 
... 
} 
+1

、バックグラウンドスレッドからUIの更新は、唯一の問題を作成します。 – rishi

答えて

3

あなたの質問は多くの情報や、詳細を与えるものではありません。

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

//

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait; 
+0

ご迷惑をおかけして申し訳ありませんが、実際にはNSObjectから継承しているTimerクラスがあります。そこから、私のViewControllerの1つにプロパティとして配置されたUILabelを更新したいと思います。今私はTimerクラスのUILabelフォームにアクセスできません。 –

+0

なぜアクセスできないのですか? Timerクラスにデリゲートプロパティを追加し、Timerインスタンスを作成するときに、デリゲートとして通信したいviewControllerをデリゲートとして設定します。その後、デリゲートのメソッドを呼び出してラベルを更新します。これは標準的なiOSデザインパターンです - それを知るにはうれしいです。そして楽しみのために、あなたはTimerクラスで他の仕事をしていますか?たぶんあなたはあまりにもオブジェクト指向を得ている;-) –

2

私は、過去に同じ何かをやりました。

私はラベルテキストを設定する機能を使用:

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

をして、同じクラスにそのラベルの生活を想定しperformSelectorOnMainThread

NSString* myText = @"new value"; 
[self performSelectorOnMainThread:(@selector)updateLabelText withObject:myText waitUntilDone:NO]; 
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"; 
} 
34

これは最も簡単で簡単な方法です。

- (void) countUpH{ 

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

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

    }]; 
} 

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

これが役に立ちます。

サム

+0

素晴らしい作品!ありがとう! :D –

+0

@ shoughton123、バックグラウンドで実行されるメソッド内で '[[NSOperationQueue mainQueue] addOperationWithBlock:...'?お返事ありがとうございます – JFS

+0

実際には、遅い返信を申し訳ありません! – shoughton123

2

適切な方法はこれです:あなたは、すべてのメインスレッドからUIを更新することができ

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

    //Do any updates to your label here 
    yourLabel.text = newText; 
    }); 
} 
関連する問題