在尚未显示的UIViewController上预加载UIWebView
我有一个应用程序在最后一个UIViewController有一个UIWebView …用户导航通过应用程序,并在最后,他们可以过渡(模态)与UIWebView的最终UIViewController …在它的viewDidLoad我有UIWebView加载页面。
问题是大约需要8秒钟来加载这个页面,并且会让用户感到恼火。
如何提前加载UIWebView的方式(如应用程序首次启动!)如果该UIViewController甚至还没有提交?
我在UIPageViewController内部遇到了与UIWebView相同的问题,我find了一个更好的解决scheme。
如果你在FirstViewController
并且在你的SecondViewController
有你的webView,那么在你的SecondViewController
的viewDidLoad
中放入loadHTMLString
或loadRequest
方法,然后调用[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的?