背景: 我有一个受广告支持的免费应用程序。基本思想是,当应用程序启动时,会在后台从服务器下载广告内容 (HTML),只有下载成功,才会显示内容。
以前的解决方案:
我已经在一个通用应用程序中成功实现了这个。最初,我加载了一个NSData
带有 URL 的变量,如果它成功,然后我展示了一个模式视图,其中包含一个UIWebView
(相关代码在另一个问题中)。问题是原始请求中没有加载外部资产(图像)NSData
,所以我灵机一动,想到了另一种方法:
新解决方案:
新方法,这就是我想要帮助的,是我正在实例化模态视图控制器(尚未显示它),并让 Web 视图开始直接加载 URL。当webViewDidFinishLoad
调用该方法时,我会向父级发送一个通知,然后执行presentModalViewController
.
以下是实例化视图控制器并以模态方式呈现它的方法:
- (void)launchAd
{
if ([ServerCheck serverReachable:@"openx.freewave-wifi.com" hideAlert:YES])
{
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(presentAdModal) name:@"AdLoaded" object:nil];
AdViewController *adView = [[AdViewController alloc] initWithNibName:nil bundle:nil];
[[adView view] awakeFromNib]; //THIS LINE IS WHAT THIS QUESTION IS ABOUT
navController = [[UINavigationController alloc] initWithRootViewController:adView];
[adView release], adView = nil;
[navController setModalPresentationStyle:UIModalPresentationFormSheet];
[navController setModalTransitionStyle:UIModalTransitionStyleCoverVertical];
[[navController navigationBar] setTintColor:[UIColor colorWithRed:0.94 green:0.00 blue:0.32 alpha:1.00]];
}
else
LogError(@"Not presenting ad.");
}
- (void)presentAdModal
{
LogInfo(@"Presenting advertisement modal.");
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"AdLoaded" object:nil];
[tabBarController presentModalViewController:navController animated:YES];
[navController release];
}
在 AdView 控制器中:
- (void)webViewDidFinishLoad:(UIWebView *)theWebView
{
LogInfo(@"Ad content did load; we can show it.");
[timeout invalidate], timeout = nil;
[self setTitle:@"From Our Sponsor"];
[[NSNotificationCenter defaultCenter] postNotificationName:@"AdLoaded" object:nil];
}
现在上面的内容确实有效。但是,我花了很长时间才弄清楚如何使控制器中的视图控制器委托AdView
方法在调用presentModalViewController
. 我通过添加[[adView view] awakeFromNib];
来做到这一点,但我知道这不是实现这一点的正确方法。
UIWebView
所以,上面的一切都很好地工作,在显示之前有效地拥有视图控制器及其“预加载”。我只想知道我应该做什么,而不是[[adView view] awakeFromNib];
——我想以正确的方式去做。
或者这是对的吗?我想有些人会说“如果它有效,那么它是正确的”,但我知道这不是真的。