我是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 **
...
}
答案 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";
}