如何从iOS中的非UI线程更新UI标签

时间:2012-06-28 10:07:12

标签: ios xcode

我是iOS开发的新手,我有简单的目标--c类“MoneyTimer.m”用于运行计时器,从那里我想用更改的计时器值更新UI标签。 我想知道如何从非UI线程访问UI元素?我正在使用Xcode 4.2和故事板。

在blackberry中,只需获取事件锁,就可以从非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 **
...
}

5 个答案:

答案 0 :(得分:34)

这是最快捷,最简单的方法:

- (void) countUpH{

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

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

   }];
}

如果您这样做,则无需切换到其他方法。

希望这有帮助。

萨姆

答案 1 :(得分:3)

您的问题没有提供太多信息或详细信息,因此很难确切知道您需要做什么(例如,如果存在“线程”问题等)。

无论如何,假设您的MoneyTimer实例具有对当前viewController的引用,您可以使用performSelectorOnMainThread

//

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

答案 2 :(得分:2)

我过去做过相同的事情。

我使用了一个函数来设置标签文本:

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

然后使用performSelectorOnMainThread

在主线程上调用此函数
NSString* myText = @"new value";
[self performSelectorOnMainThread:(@selector)updateLabelText withObject:myText waitUntilDone:NO];

答案 3 :(得分:2)

正确的方法是:

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

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

答案 4 :(得分: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";
}