Проблемы с NSNotificationCenter и UIPickerView - PullRequest
2 голосов
/ 09 декабря 2011

Надеюсь, мне повезет больше, если кто-то поможет мне в этом:

У меня есть UIPickerView, где пользователь делает выбор, а затем нажимает кнопку. Я могу с радостью получить выбор пользователей, как показано в моем NSLog, и когда это будет сделано, я хочу отправить уведомление другому контроллеру представления, который покажет метку с выбранной опцией. Ну, хотя кажется, что все сделано правильно, почему-то это не работает, и этикетка остается неповрежденной. Вот код:

Транслятор:

 if ([song isEqualToString:@"Something"] && [style isEqualToString:@"Other thing"])

{
    NSLog (@"%@, %@", one, two);
    [[NSNotificationCenter defaultCenter] postNotificationName:@"Test1" object:nil];

ReceiverViewController *receiver = [self.storyboard instantiateViewControllerWithIdentifier:@"Receiver"];
    [self presentModalViewController:receiver animated:YES];

}

Наблюдатель:

    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) 
{
    [[NSNotificationCenter defaultCenter] addObserver:self     selector:@selector(receiveNotification) name:@"Test1" object:nil];
}
    return self;
}

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

if ([[notification name] isEqualToString:@"Test1"]) 
{

    [label setText:@"Success!"];
    NSLog (@"Successfully received the test notification!");
}

else

{
    label.text = @"Whatever...";
}


}

Ответы [ 2 ]

1 голос
/ 29 января 2014

Я думаю, у вас есть синтаксическая ошибка в вашем селекторе: @selector(receiveNotification).Вероятно, это должно быть @selector(receiveNotification:) с двоеточием, поскольку ваш метод принимает сообщение NSNotification *notification.Без этого это другая подпись.

0 голосов
/ 11 декабря 2011

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

См. Мой ответ на этот вопрос , чтобы узнать о темах и NSNotifications.

Используйте что-то вроде:

NSLog(@"Code executing in Thread %@",[NSThread currentThread] );

для сравнения вашего основного потока с тем, где выполняется ваш recieveNotifcation: метод.

Если вы отправляете уведомление в потоке, который не является основным, решение может заключаться в том, чтобы транслировать ваши уведомления в основном потоке следующим образом:

//Call this to post a notification and are on a background thread      
- (void) postmyNotification{
  [self performSelectorOnMainThread:@selector(helperMethod:) withObject:Nil waitUntilDone:NO];
}

//Do not call this directly if you are running on a background thread.
- (void) helperMethod{
  [[NSNotificationCenter defaultCenter] postNotificationName:@"SOMENAME" object:self];
}

Если вы заботитесь только об обновлении метки в основном потоке, вы можете выполнить эту операцию в основном потоке, используя что-то похожее на:

dispatch_sync(dispatch_get_main_queue(), ^(void){
                            [label setText:@"Success!"];
                        });

Надеюсь, это было полезно!

...