如何“预加载”视图控制器而不实际推动它?

时间:2011-03-03 15:08:12

标签: uiwebview modal-dialog preload viewcontroller

背景 我有一个广告支持的免费应用。基本的想法是,当应用程序启动时,广告内容(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]; - 我想以正确的方式去做。

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

0 个答案:

没有答案