3

背景: 我有一个受广告支持的免费应用程序。基本思想是,当应用程序启动时,会在后台从服务器下载广告内容 (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];——我想以正确的方式去做。

或者这是对的吗?我想有些人会说“如果它有效,那么它是正确的”,但我知道这不是真的。

4

0 回答 0