iPhone标签未更新

时间:2012-01-31 23:43:25

标签: iphone label

我想从单独的线程更新iPhone表单上的标签。线程正在运行但标签未更新。

这是我的代码

-(void)launchThread:(id)param;
@property (weak, nonatomic) IBOutlet UILabel *timeLabel;

...

-(void) launchThread:(id)param{
UILabel *control = (UILabel*)param;
NSMutableString *str;
for (int i=0; i<1000; i++) {
    str = [NSMutableString stringWithFormat:@"%d",i];
    control.text=str;
    NSLog(@"%@",str);
    sleep(1);
}}

...

- (void)viewDidLoad {
    [super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
    [NSThread detachNewThreadSelector:@selector(launchThread:) toTarget:self withObject:timeLabel];
}

我猜标签的文本已更新但未在表单上刷新。我该如何刷新它?

我试图寻找类似的帖子,但它们对我不起作用。对不起,如果我重复这个问题。

2 个答案:

答案 0 :(得分:2)

@jackslash是正确的,你只能更新主线程(UI线程)上的接口。我建议使用performSelectorOnMainThread来更新你的UILabel。我认为语法类似于:

[self.label performSelectorOnMainThread : @ selector(setText : ) withObject:str waitUntilDone:YES];

不太确定。做一些谷歌搜索,你应该能够找到一个有效的例子。

答案 1 :(得分:1)

在iOS中,您只能使用主线程来更新界面。

您可以通过两件事轻松地从线程更新界面。像这样使用NSObject的方法:

[self performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait];

使用块和GCD:

dispatch_async(dispatch_get_main_queue(),{
    //code to execute on main thread
});