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

我有一个应用程序在最后一个UIViewController有一个UIWebView …用户导航通过应用程序,并在最后,他们可以过渡(模态)与UIWebView的最终UIViewController …在它的viewDidLoad我有UIWebView加载页面。

问题是大约需要8秒钟来加载这个页面,并且会让用户感到恼火。

如何提前加载UIWebView的方式(如应用程序首次启动!)如果该UIViewController甚至还没有提交?

我在UIPageViewController内部遇到了与UIWebView相同的问题,我find了一个更好的解决scheme。

如果你在FirstViewController并且在你的SecondViewController有你的webView,那么在你的SecondViewControllerviewDidLoad中放入loadHTMLStringloadRequest方法,然后调用[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]; } 

你能做的是加载htmlstring

  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]]; 

那么你的webview只需要呈现你的内容,不会加载数据

///在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的工作方式相同

不知道你想为此做多less工作,但是我想你可以使用[NSUserDefaults standardUserDefaults]来caching/存储来自URL的数据,像NSDictionary或类似的东西,并在实际加载页面之前使用这些信息。

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

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

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

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

你可以做的就是将UIWebView添加到一开始的视图层次结构(如你所提到的),然后通过预加载的数据传递给最后一个视图控制器。 这可能工作,但它不是一个优雅的方式。

侧面的问题是:为什么需要8秒来加载一个页面? 也许你可以更早地下载这个页面的内容? 它是静态的还是dynamic的?