UILabel не будет обновляться даже при dispatch_async

По какой причине мой ярлык не будет обновляться?

- (void)setLabel:(NSNotification*)notification {
    dispatch_async(dispatch_get_main_queue(), ^{
        NSLog(@"setLabel");
        [self.label setText:@"My Label"];
    });
}

Я также пытался использовать PerformSelectorOnMainThread безрезультатно.

Обратите внимание, что setLabel отображается в журнале.

Дополнительная информация:

У меня также есть две другие функции, которые делают то же самое, но только с другим текстом. Две другие функции не имеют dispatch_async, но обе они работают. Кроме того, уведомление о двух рабочих функциях было отправлено NSURLConnection (метод № 2 в этом сообщении). В то время как уведомление о неработающей функции выше было отправлено вызовом FBRequestConnection (см. этот пост).

Для ясности две мои другие рабочие функции выглядят следующим образом:

- (void)setLabel2:(NSNotification*)notification {
    NSLog(@"setLabel2");
    [self.label setText:@"My Label 2"];
}    
- (void)setLabel3:(NSNotification*)notification {
    NSLog(@"setLabel3");
    [self.label setText:@"My Label 3"];
}

Да, я пытался удалить dispatch_async в своем коде. На самом деле изначально не было dispatch_async, потому что работали два других.


person ian    schedule 08.06.2013    source источник
comment
Вы пытались временно удалить dispatch_async, чтобы увидеть, установлена ​​ли метка независимо?   -  person jfuellert    schedule 08.06.2013
comment
убедитесь, что вы работаете с правильным ярлыком, и он установлен как правильный выход из вашей раскадровки   -  person Oleg    schedule 08.06.2013
comment
@Kreiri - если бы это было нулем, разве это не должно привести к сбою приложения? Мой не падает после вызова этой линии.   -  person ian    schedule 09.06.2013
comment
@Jfuellert - изначально у него не было dispatch_async, я добавил его, чтобы убедиться, что он обновляется, но это не так.   -  person ian    schedule 09.06.2013
comment
@Олег - это единственный ярлык. Есть другие коды, которые вызывают тот же код, и они работают.   -  person ian    schedule 09.06.2013
comment
Отправка сообщения nil разрешена в Objective-C. Это ничего не делает. Вам нужно выяснить, почему self.label равно нулю.   -  person rob mayoff    schedule 09.06.2013
comment
@robmayoff - к сожалению, это не ноль. :(   -  person ian    schedule 09.06.2013
comment
Следующая распространенная причина заключается в том, что self.label указывает не на метку на экране, а на что-то другое. Попробуйте позвонить [self.label setText:] в другом месте, например, в viewDidLoad, и убедитесь, что он действительно обновляется, и с помощью NSLog убедитесь, что это один и тот же адрес.   -  person Rob Napier    schedule 09.06.2013
comment
@RobNapier - как я уже сказал в своем вопросе, у меня также есть 2 другие функции, которые делают то же самое, и обе они работают. Я снова отредактирую свой вопрос для ясности.   -  person ian    schedule 10.06.2013
comment
Да, я видел это. Добавьте проверку, что адрес self.label во всех этих случаях один и тот же. Вы либо не обновляете объект, которым себя считаете, либо объект, который вы обновляете, отсутствует на экране, либо вы не находитесь в основном потоке. Вот причины неудачи, которую вы описываете. Выяснение того, что является фактической причиной, заключается в том, как вы ее отлаживаете.   -  person Rob Napier    schedule 11.06.2013
comment
@RobNapier благодарит Роба за ваши ответы. Я подтвердил, что во всех трех функциях self.label имеет один и тот же адрес памяти. Я также могу подтвердить, что self.label находится на экране, потому что на нем отображается текст. Как убедиться, что вы находитесь в основной теме? Когда я отлаживаю все 3 функции, все они отображаются в потоке 1. Единственное различие, которое я вижу, это стек. Неработающая функция уведомляется с помощью FBRequestConnection, а две другие рабочие функции уведомляются с помощью NSURLConnection. Любая другая возможная причина, по которой он не будет обновляться?   -  person ian    schedule 11.06.2013
comment
До сих пор вы убедились, что метка a отображается на экране, проверив отображаемый текст. Это не означает, что это self.label. Наиболее вероятная проблема заключается в том, что вы видите не тот объект, который пытаетесь изменить. Проверьте иерархию представлений (superview.subviews) и убедитесь, что в ней нет лишних ваших копий.   -  person Rob Napier    schedule 11.06.2013
comment
@RobNapier, как мне проверить иерархию представлений (superview.subviews)?   -  person ian    schedule 13.06.2013
comment
по self.view.superview.subviews   -  person Rob Napier    schedule 13.06.2013
comment
@RobNapier - В окне просмотра self.view существует, а self.view.superview - нет. Я также проверил self.label.view, но его не существует. Любые другие идеи?   -  person ian    schedule 13.06.2013


Ответы (1)


Если вы установите точку останова сразу после того, как вы установите текст и напечатаете описание self.label, покажет ли это, что текст изменился? Если это так, он должен сбрасываться где-то еще после срабатывания этого метода. Если self.label равен нулю, то это ваша проблема

person anders    schedule 08.06.2013
comment
Чаще всего ничего не происходит из-за того, что что-то nil. Туда я бы посмотрел в первую очередь. - person Rob Napier; 08.06.2013
comment
@anders - нет, текст не устанавливается даже при переходе к кодам. - person ian; 09.06.2013
comment
@Rob Napier - если бы это было нулем, разве это не должно привести к сбою приложения? Мой не падает после вызова этой линии. - person ian; 09.06.2013
comment
Нет, отправка сообщений на nil не приводит к сбоям. - person Catfish_Man; 09.06.2013
comment
@Catfish_Man - к сожалению, это не ноль. :( - person ian; 09.06.2013
comment
трудно сказать, что не так, с того места, где я сижу, я бы попытался посмотреть, что вы делаете иначе, чем те, которые работают, и/или опубликовать еще немного кода, если хотите - person anders; 11.06.2013