我有一个应用程序,在最后一个UIViewController上有一个UIWebView ...用户浏览应用程序,最后他们可以通过UIWebView转换(模态)到最终的UIViewController ...在它的viewDidLoad我有UIWebView加载页面。
问题是加载此页面大约需要8秒钟,这会让用户感到烦恼。
如果UIViewController还没有出现,我怎样才能提前加载UIWebView(就像应用程序首次启动时一样!)
答案 0 :(得分:19)
我在UIPageViewController中遇到了同样的UIWebView问题,我发现了一个更好的解决方案。
如果您在FirstViewController
,并且SecondViewController
中的网络视图已将loadHTMLString
或loadRequest
方法放入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秒?也许您可以提前下载此页面的内容?它是静态的还是动态的?