背景 我有一个广告支持的免费应用。基本的想法是,当应用程序启动时,广告内容(HTML)将在后台从服务器下载,只有下载成功,才会显示内容。
以前的解决方案:
我已经在通用应用程序中成功实现了这一点。最初,我加载了一个带有URL的NSData
变量,如果它成功了,那么我提出了一个包含UIWebView
的模态视图(相关代码在another question中)。问题是外部资产(图像)没有加载到原始的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];
- 我想以正确的方式去做。
或者这是对的吗?我猜有些人会说“如果它有效,那就是对的”,但我知道这不是真的。