ярлык iPhone не обновляется - PullRequest
2 голосов
/ 01 февраля 2012

Я хочу обновить ярлык на форме 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 ]

2 голосов
/ 01 февраля 2012

@ jackslash правильно, вы можете обновить интерфейс только в главном потоке (поток пользовательского интерфейса).Я бы предложил использовать performSelectorOnMainThread для обновления вашей UILabel.Я думаю, что синтаксис выглядит примерно так:

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

Не совсем уверен, хотя.Сделайте поиск в Google, и вы сможете найти работающий пример с ним.

1 голос
/ 01 февраля 2012

В 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
});
...