在尚未显示的UIViewController上预加载UIWebView

时间:2014-02-04 21:26:27

标签: ios objective-c uiviewcontroller uiwebview load

我有一个应用程序,在最后一个UIViewController上有一个UIWebView ...用户浏览应用程序,最后他们可以通过UIWebView转换(模态)到最终的UIViewController ...在它的viewDidLoad我有UIWebView加载页面。

问题是加载此页面大约需要8秒钟,这会让用户感到烦恼。

如果UIViewController还没有出现,我怎样才能提前加载UIWebView(就像应用程序首次启动时一样!)

4 个答案:

答案 0 :(得分:19)

我在UIPageViewController中遇到了同样的UIWebView问题,我发现了一个更好的解决方案。

如果您在FirstViewController,并且SecondViewController中的网络视图已将loadHTMLStringloadRequest方法放入viewDidLoad SecondViewController[secondViewController.view layoutSubviews]调用FirstViewController开始加载。

例如:

<强> FirstViewController

-(void)viewDidLoad{
    [super viewDidLoad];
    // _secondViewController -> An instance of SecondVieController
    [_secondViewController.view layoutSubviews];
}

<强> SecondViewController

-(void)viewDidLoad{
    [super viewDidLoad];
    NSURL *url =[NSURL URLWithString:@"http://www.google.it"];
    NSURLRequest *request =[NSURLRequest requestWithURL:url];
    [self.webView loadRequest:request];
}

答案 1 :(得分:5)

你可以做的是,加载html字符串

 NSString *htmlFile = [[NSBundle mainBundle] pathForResource:self.path ofType:@"htm"];
 NSError * error;
 NSString* htmlString = [NSString stringWithContentsOfFile:htmlFile encoding:NSUTF8StringEncoding error:&error];

当您显示webView时,在webView中加载此内容

[self.webView loadHTMLString:htmlString baseURL:[[NSBundle mainBundle] bundleURL]];

然后您的网络视图只需呈现您的内容而不会加载数据

///在Swift 2.0中

    do{
        let path = NSBundle.mainBundle().pathForResource("theName", ofType: "html")!
        let html = try String(contentsOfFile: path, encoding: NSUTF8StringEncoding)
        webView.loadHTMLString(html, baseURL: nil)
    }catch{
        print("Error is happend")
    }

注意:对于WKWebView

,它的工作方式相同

答案 2 :(得分:0)

不确定您要为此做多少工作,但我认为您可以使用[NSUserDefaults standardUserDefaults]缓存/存储来自URL的数据,如NSDictionary或类似的东西,并在实际加载之前使用该信息页面。

因此,在第一次使用它之后加载,在看到之后再使用NSUserDefaults存储数据。下次转到此页面时,首先从NSUserDefaults加载并在后台调用URL / API,然后使用此新数据更新NSUserDefaults。

如果您每次都要求或提取具体信息,那么我认为这不会起作用。如果是这种情况,您可以尝试在早期的视图控制器中加载数据/网站(可能需要用户一段时间才能导航到该控制器),然后将该数据发送到webview。像委托/协议或甚至NSNotificationCenter的东西。希望这可以帮助。

答案 3 :(得分:-4)

UIWebView是非常棘手的对象。简单的答案是:不,你不能。

UIWebView如果不在视图层次结构中,则不会加载文档或URL。 不要尝试在不同的线程/队列中执行它。

您可以做的是在一开始就将UIWebView添加到视图层次结构中(如您所述),然后将其传递给具有预加载数据的最后一个视图控制器。这可能有用,但这不是一种优雅的方式。

附带问题是:为什么加载页面需要8秒?也许您可以提前下载此页面的内容?它是静态的还是动态的?