【问题标题】:PreLoad UIWebView on a not yet displayed UIViewController在尚未显示的 UIViewController 上预加载 UIWebView
【发布时间】:2014-03-01 02:09:53
【问题描述】:

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

问题是加载此页面大约需要 8 秒,这让用户很恼火。

如果 UIViewController 还没有出现,我如何提前加载 UIWebView(比如应用首次启动时!)?

【问题讨论】:

    标签: ios objective-c uiviewcontroller uiwebview load


    【解决方案1】:

    你可以做的是,加载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]];
    

    那么你的 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 的工作方式相同

    【讨论】:

      【解决方案2】:

      我在 UIPageViewController 中遇到了与 UIWebView 相同的问题,我找到了更好的解决方案。

      如果您在 FirstViewController 并且您的 webView 在您的 SecondViewController 中,请将 loadHTMLStringloadRequest 方法放入您的 SecondViewControllerviewDidLoad 并调用 [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];
      }
      

      【讨论】:

      • 太棒了!!!我搜索了几个小时并没有找到解决方案。真是不错的把戏! :)
      • 我知道这是旧的,但想知道您是否可以将其翻译成 swift ?谢谢
      • @dwinnbrown 不,我没有,但应该不难做到,用swift而不是objective-c调用相同的方法
      • @dwinnbrown 正如苹果建议的那样,而不是调用 layoutSubviews,最好调用:[_secondViewController.view setNeedsLayout]; [_secondViewController.view layoutIfNeeded];
      • 这在 Xcode 8 中对我不起作用,它在第二个视图控制器上调用“viewDidLoad”,正如我在日志中看到的那样。但是,它似乎不会触发 webView 加载。我从来没有看到触发过 webView 的委托方法,而且当我切换到第二个控制器时,我还需要等待页面加载吗?有什么想法吗?
      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        附带的问题是:为什么加载一个页面需要 8 秒?也许你可以早点下载这个页面的内容?是静态的还是动态的?

        【讨论】:

        • 动态/:网站的图形很重。
        猜你喜欢
        • 1970-01-01
        • 2019-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多