我希望有更好的运气能帮助我解决这个问题:
我有一个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...";
}
}
答案 0 :(得分:1)
我认为您的选择器中存在语法错误:@selector(receiveNotification)
。由于您的方法接受@selector(receiveNotification:)
消息,因此结肠可能应为NSNotification *notification
。没有它,它是一个不同的签名。
答案 1 :(得分:0)
问题很可能是在与主线程不同的线程上发送(并因此收到)通知。只有在主线程上,您才能更新UI元素(如标签)。
有关线程和NSNotifications的一些见解,请参阅我对this question的回答。
使用类似:
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!"];
});
希望这很有用!