Почему мои UILabels не обновляются новой информацией после обновления NSNotificationCenter? - PullRequest
1 голос
/ 15 ноября 2010

Я работаю над погодным приложением, и у меня все работает отлично ... За исключением UILabels, которые отображают данные.Как только приложение загружается в первый раз, оно проходит и находит данные правильно, а затем отображает их.

Вот так выглядит один из UILabels внутри моего основного RootViewController:

UILabel *myCityLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 30, 200, 80)];
[myCityLabel setText:[NSString stringWithFormat:@"%@",placemark.locality]];
myCityLabel.textAlignment = UITextAlignmentLeft;
myCityLabel.textColor = [UIColor blackColor];
myCityLabel.font = [UIFont fontWithName:@"Helvetica" size:24];
myCityLabel.backgroundColor = [UIColor clearColor];
[self.view addSubview:myCityLabel];
[myCityLabel release];

У меня CoreLocation работает в фоновом режиме.Внутри моего appDelegate я вижу, как эти два метода вызываются, когда приложение вызывается снова (после его закрытия):

- (void)applicationDidBecomeActive:(UIApplication *)application {
NSLog(@"applicationDidBecomeActive:");

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(deviceNotificationReceived:) name:UIApplicationDidBecomeActiveNotification object:nil];

/*
 Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
 */

lbsViewController = [[LBSViewController alloc] init];
[lbsViewController viewDidLoad];
}

- (void)deviceNotificationReceived:(NSNotification *)notification
{
    NSLog(@"was this received?");
}

Я пытаюсь здесь запустить viewDidLoad метод lbsViewController (мой основной RootViewController. Я вижу через консоль, что он возвращает новую информацию, и даже что вызывается функция viewDidLoad, но метки не обновляются с новыми данными ... любые предложения о том, какой маршрут(s) Могу ли я воспользоваться этой проблемой?

Я должен отметить, что единственный раз, когда UILabels обновляется новыми данными, - это сборка приложения из Xcode на моем устройстве.

Ответы [ 2 ]

2 голосов
/ 15 ноября 2010

Вы говорите, что решили проблему, удалив многозадачность.Ваша проблема заключалась в том, что NSNotification, отправленное вами из фонового потока, поступило в тот же фоновый поток, и вы попытались обновить UILabel из этого фонового потока.Это недопустимо - вы должны обновить элементы пользовательского интерфейса из основного потока.

Чтобы решить эту проблему, вы можете перенаправить вызов в основной поток, используя:

- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait

, что-то вродеthis (в вашем обработчике уведомлений):

[viewController.outputLabel performSelectorOnMainThread: @selector( setText: ) withObject: currentChar waitUntilDone: YES];

примечание, это тот же ответ, который я дал на этот вопрос: Как отображать символы в UILabel при их циклическом просмотре?

0 голосов
/ 15 ноября 2010

Две строки:

lbsViewController = [[LBSViewController alloc] init];
[lbsViewController viewDidLoad];

Выделите новый LBSViewController и вызовите для него viewDidLoad. Возможно, вы хотите вызвать viewDidLoad для вашего существующего объекта lbsViewController, а не выделять новый (т.е. удалить первую из этих двух строк).

В любом случае, было бы лучше, если бы контроллер вида наблюдал само уведомление и разбирался со всем внутри. Этот вид перезагружает значение viewDidLoad, и добавление метода с альтернативным именем, возможно, распределяет логику странным образом.

...