【问题标题】:UIWebView doesn't load pages properlyUIWebView 无法正确加载页面
【发布时间】:2014-08-15 15:11:35
【问题描述】:

我对 Xamarin 和 iOS 还很陌生,我正在整理一个小型 POC 应用来学习。

该应用程序使用一个包含 UIWebView 的视图。我打算将本地 Web 文件加载到其中,然后使用 JavaScript 和 C#(JS 桥)混合操作这些文件,但 UIWebView 无法正常运行。它根本不加载页面。如果我卸载该应用程序,然后重新安装并运行它,它通常会成功加载网页,但在随后的会话中,网页通常不会加载,将网页视图保留为白色空白区域。只是为了确保我尝试加载众所周知的网页,例如xamarin.comapple.com。同样,我第一次运行它时页面会加载,但在随后的会话中它们不会。物理设备(iPhone 5)和模拟器上的行为是相同的。

是否需要考虑如何使用 UIWebView?托管它的 ViewController 是 SlideoutNavigationController 的子视图。

我对 UIWebView 的经验很少,因此非常感谢任何提示。

谢谢

编辑: 加载网页视图的代码:

    WebView.LoadFinished += (object sender, EventArgs e) => 
    {
        UIApplication.SharedApplication.NetworkActivityIndicatorVisible = false;                System.Diagnostics.Debug.WriteLine("Web page was loaded");
    };
    WebView.LoadError += (object sender, UIWebErrorArgs e) => 
    {
        UIApplication.SharedApplication.NetworkActivityIndicatorVisible = false;                System.Diagnostics.Debug.WriteLine(e);
    };
    WebView.ShouldStartLoad += (UIWebView webView, NSUrlRequest request, UIWebViewNavigationType navigationType) => 
    {
        return true;
    };
    WebView.Layer.BorderColor = UIColor.Red.CGColor;
    WebView.Layer.BorderWidth = 10;
    WebView.LoadRequest(new NSUrlRequest(new NSUrl("http://www.apple.com")));
    UIApplication.SharedApplication.NetworkActivityIndicatorVisible = true;
    WebView.ScalesPageToFit = true;

注意:ShouldStartLoad 事件处理程序是唯一被调用的。

这是页面加载(失败)后 iOS 模拟器的样子:

【问题讨论】:

  • 当您看到白屏时,您确定UIWebView 存在吗?尝试在UIWebView 周围绘制红色边框以确保确定。请向我们展示您加载网页的代码。
  • webView.Layer.BorderColor = UIColor.Red.CGColor; webView.Layer.BorderWidth = 10;
  • 我添加了代码和屏幕截图。如您所见,Web 视图确实可见。我还尝试添加自定义委托,以查看调用了哪些方法。但是,没有一个被覆盖的方法被调用。另外,谁能告诉我底部半透明表面是什么?我仔细检查了 UI 设计器,没有为这个 VC 设置底栏。
  • 您是否实现了ShouldStartLoad 委托?查看以下答案(如果您想打开 UIWebView 中的每个网页,您可以在处理程序中简单地返回 true)stackoverflow.com/questions/21851412/…
  • 好的,我尝试为ShouldStartLoad 实现一个事件处理程序,它只返回true。处理程序被正确调用,但页面仍然没有加载,并且没有其他事件处理程序被调用。

标签: uiwebview xamarin.ios


【解决方案1】:

想通了。事实证明,使用(非常轻的)HTML 内容(例如 HTML 字符串)加载 WebView 实际上比从 Web 服务获取我自己的对象需要更多时间。当 Web 服务返回的数据可用时,WebView 还没有完成网页的加载。因此,当我的客户端代码得到 Web 服务结果时,没有要装饰的网页,并且代码妨碍了 WebViews 的正常加载操作。

此代码修复了同步问题:

    private ManualResetEvent _syncLoadWebPage = new ManualResetEvent(false);

    private void loadEmptyWebPage()
    {
        const string EmptyHtml =
            "<html><head></head><body style=\"background: aquamarine\"><H1>EMPTY PAGE</H1></body></html>"; 

        WebView.LoadFinished += (sender, e) => webPageReady();
        WebView.LoadStarted += (sender, e) => UIApplication.SharedApplication.NetworkActivityIndicatorVisible = true;
        WebView.LoadHtmlString(EmptyHtml, new NSUrl(AppDelegate.Current.Data.Web.LocalWebRoot, true));
        WebView.ScalesPageToFit = true;
    }

    private void webPageReady()
    {
        _syncLoadWebPage.Set();
    }

    void whenWebPageIsReady(Action callback)
    {
        Task.Factory.StartNew(() => 
            {
                _syncLoadWebPage.WaitOne();
                callback();
            });
    }

    void bindMapFile()
    {
        whenWebPageIsReady(() => 
            {
                UIApplication.SharedApplication.NetworkActivityIndicatorVisible = false;
                var snap = new Snap(new WebViewImpl(WebView));
                snap.Image(Model.MapFilePath, "map", 0, 0, Model.MapSize.Width, Model.MapSize.Height);
                // todo Decorate stuff with map here ...
            });
    }

我所要做的就是等待网页完成加载,一切似乎都正常了。我只是从我所看到的中得出了错误的结论。

很傻,真的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-20
    • 2011-06-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-24
    • 2019-12-23
    • 2016-07-23
    • 1970-01-01
    相关资源
    最近更新 更多