我有一个想要在某个事件上显示的视图。我的视图控制器正在侦听模型发送的广播通知,它会在接收到广播时尝试显示视图。
然而,这种观点并没有出现。但是如果我从View Controller中的其他地方运行完全相同的视图代码,那么它将被显示。以下是来自VC的一些代码来说明:
- (void) displayRequestDialog
{
MyView *view = (MyView*)[[[NSBundle mainBundle] loadNibNamed:@"MyView" owner:self options:nil] objectAtIndex:0];
view.backgroundColor = [UIColor lightGrayColor];
view.center = self.view.window.center;
view.alpha = 1.0;
[self.view addSubview:view];
}
- (void) requestReceived: (NSNotification*) notification
{
[self displayRequestDialog];
}
运行上述代码时,视图不会出现。但是,如果我在其他地方添加对displayRequestDialog的调用,例如viewDidAppear:
- (void) viewDidAppear
{
[self displayRequestDialog];
}
然后显示。
因此,我的问题显然是为什么如果我从viewDidLoad调用displayRequestDialog,我可以成功显示视图,但是如果从requestReceived中调用它将不会显示?
(请注意,在视图控制器/其视图加载并显示之前,我没有提前调用requestReceived)
起初我发布了这样的通知:
[[NSNotificationCenter defaultCenter] postNotificationName: kMyRequestReceived
object: self
userInfo: dictionary];
然后我尝试了这个:
NSNotification *notification = [NSNotification notificationWithName:kMyRequestReceived object:self userInfo:dictionary];
NSNotificationQueue *queue = [NSNotificationQueue defaultQueue];
[queue enqueueNotification:notification postingStyle:NSPostWhenIdle];
然后我尝试了这个:
dispatch_async(dispatch_get_main_queue(),^{
[[NSNotificationCenter defaultCenter] postNotificationName: kMyRequestReceived
object: self
userInfo: dictionary];
});
然后我尝试了这个:
[self performSelectorOnMainThread:@selector(postNotificationOnMainThread:) withObject:dictionary waitUntilDone:NO];
- (void) postNotificationOnMainThread: (NSDictionary*) dict
{
[[NSNotificationCenter defaultCenter] postNotificationName: kMyRequestReceived
object: self
userInfo: dict];
}
我试过像这样调用displayRequestDialog:
dispatch_async(dispatch_get_main_queue(),^{
[self displayRequestDialog];
});
我发现视图没有显示的原因 - 当通过通知代码调用时,框架的原点变为负值,否则在被调用时正值显示,因此正在屏幕上显示。 不知道为什么会出现差异。
答案 0 :(得分:0)
您没有收听通知。这样做:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(displayRequestDialog) name:kMyRequestReceived object:nil];
答案 1 :(得分:0)
至于我们看不到您用来注册控制器以接收通知的代码,我建议您使用观察者注册方法,强制在主线程上“免费”获取通知
[[NSNotificationCenter defaultCenter] addObserverForName:@"Notification" object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
NSLog(@"Handle notification on the main thread");
}];