【发布时间】:2013-05-27 03:10:29
【问题描述】:
我有一个视图控制器,它可以查询网络服务是否应该显示插页式广告。如果是这样,则使用 presentViewController:animated:completion: 实例化和呈现另一个视图控制器。根据this answer 和docs,我假设 viewDidAppear: 在关闭呈现的视图控制器(它自己完成)时不会被调用。从概念上讲,无论如何对我来说,呈现视图控制器的视图永远不会从视图层次结构中删除,因此永远不需要“重新出现”。我显然错了。那么发生了什么?为什么我看到的与文档所说的不同?
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
[[AdService sharedAdService] adForSlotName:@"Main Interstitial" completionBlock:^(Ad *adForSlotName) {
if(adForSlotName)
{
InterstitialAdViewController_iPhone *interstitialAdViewController = [[InterstitialAdViewController_iPhone alloc] init];
interstitialAdViewController.ad = adForSlotName;
dispatch_queue_t mainQueue = dispatch_get_main_queue();
dispatch_async(mainQueue, ^{
[self presentViewController:interstitialAdViewController animated:YES completion:^{}];
});
[interstitialAdViewController release];
}
}];
}
- (void)viewWillDisappear:(BOOL)animated
{
[[AdService sharedAdService] clearAdForSlotName:@"Main Interstitial"];
[super viewWillDisappear:animated];
}
【问题讨论】:
-
哪个视图在什么时候收到 viewDidAppear?对我来说,你的问题似乎不清楚。我假设只要出现视图就会调用 viewDidAppear 。出现可能是在呈现视图后发生的事情,但也可能在之前覆盖它的视图被移除(关闭)后发生在底层视图上。
-
抱歉,viewDidAppear: 在呈现的视图控制器上被调用,只要呈现的视图控制器关闭。
-
这将符合我在第一条评论第二部分中起草的期望,并且完全符合预期。
-
谢谢,直到,我在下面的评论中提到我的问题始于 viewWillDisappear: 但我认为我可以用 viewDidAppear: 来构建我的问题。也许我认为 viewDidAppear: 被称为视图必须已经“消失”或从未出现过。
标签: ios objective-c uiviewcontroller grand-central-dispatch uiview-hierarchy