20

我是iOS开发的新手,我有简单的objective -c class“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

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

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

//

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;
于 2012-06-28T10:18:18.637 回答
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 回答
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 回答