如果响应通知而显示,则不显示视图,否则显示

时间:2014-01-15 21:33:49

标签: ios

我有一个想要在某个事件上显示的视图。我的视图控制器正在侦听模型发送的广播通知,它会在接收到广播时尝试显示视图。

然而,这种观点并没有出现。但是如果我从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];
});

我发现视图没有显示的原因 - 当通过通知代码调用时,框架的原点变为负值,否则在被调用时正值显示,因此正在屏幕上显示。 不知道为什么会出现差异。

2 个答案:

答案 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");
}];