2015-05-30 4 views
1

В моем приложении iOS я пытаюсь установить текст UILabel в другом представлении.Невозможно установить UILabel Text Programmatically

Я делаю это, передавая NSNotification viewController, когда он должен быть обновлен. Я знаю, что он правильно получает сообщение, потому что я регистрирую сообщение, но он просто не отображается в UILabel (который я добавил в раскадровке).

Это мой код:

ProcessingViewController.h

@property (weak, nonatomic) IBOutlet UILabel *progressMessage; 

ProcessingViewController.m

- (void)viewDidLoad { 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateProgressDialog:) name:@"uploadProgress" object:nil]; 
} 

-(void) updateProgressDialog: (NSNotification *) notification{ 
    NSString *message = [notification object]; 
    NSLog(@"received updateProgressDialog message of %@", message); 
    self.progressMessage.text = message; 
    [self.progressMessage setNeedsDisplay]; 
} 

Мой Раскадровка:

enter image description here

+2

Является ли 'IBOutlet' зацепил? I.e., является 'progressMessage' non-'nil'? Если 'nil', это может произойти либо в том случае, если' IBOutlet' не подключен в Interface Builder, а сам контроллер представления некорректно создан (например, '[[[ProcessXController alloc] init]', а не '[self.storyboard instantiateViewControllerWithIdentifier : ...] '). – Rob

+0

@Rob да и да. Я могу зарегистрировать progressMessage и подтвердить, что это не ноль. Кроме того, я подключил IBOutlet, используя раскадровку. Я добавил изображение, чтобы показать, как я подключил IBOutlet. – scientiffic

+0

Затем подтвердите 'frame'' progressMessage'. Убедитесь, что он достаточно широкий, чтобы отобразить текст. Возможно, вы захотите взглянуть на всю иерархию представлений, чтобы убедиться, что кадры правильные и что у вас нет чего-то перед ярлыком, затеняя его. Например, выполните паузу и введите 'po [[UIWindow keyWindow] recursiveDescription]' в приглашении '(lldb)'. Вы также можете попробовать несколько отладочный отладчик вида, встроенный в Xcode. – Rob

ответ

2

Диагностировать это в автономном режиме, мы подтвердили, что это действительно принимаются на фоне потоке. В этом случае вы можете либо опубликовать уведомление в основную очередь, или вы можете иметь updateProgressDialog отправку пользовательского интерфейса обновления основной очередь:

-(void) updateProgressDialog: (NSNotification *) notification{ 
    NSString *message = [notification object]; 
    NSLog(@"received updateProgressDialog message of %@", message); 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     self.progressMessage.text = message; 
    }); 
} 
0

Мне очень жаль, но я не очень понимаю ваш вопрос:

Что я имею в виду, вы должны ViewController и ваши передаю сообщение от childViewController к parentViewController с помощью NSNotificationCenter? Это кор

- (void)viewDidLoad 
{ 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateProgressDialog:) name:@"uploadProgress" object:nil]; 
} 

, но если вы хотите отправить сообщение обратно сообщение с помощью NSNotificationCenter

//childViewController.m

//i tried adding this to your code to test if the `NSNotificationCenter ` responds, and it is responding 
[[NSNotificationCenter defaultCenter] postNotificationName:@"uploadProgress" object:@"Your message"]; 

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

-(void) updateProgressDialog: (NSNotification *) notification{ 

    NSString *message = [notification object]; 

    NSLog(@"received updateProgressDialog message of %@", message); 

    dispatch_async(dispatch_get_main_queue(), ^(void){ 
     self.progressMessage.text = message; 
    }); 
} 

Редактировать

и там вы идете, я получил вниз голосование за то, что медленный интернет во время редактирования моего ответа ..

Смежные вопросы