UIWebView无法正确加载页面

时间:2014-06-25 07:00:49

标签: uiwebview xamarin.ios

我是Xamarin和iOS的新手,我正在整理一个小型的POC应用程序来学习。

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

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

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

由于

编辑: 加载Web视图的代码:

    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模拟器在页面(未能)加载后的样子:

enter image description here

1 个答案:

答案 0 :(得分:2)

想出来。事实证明,使用(非常轻的)HTML内容(例如HTML字符串)加载WebView实际上需要比从Web服务获取我自己的对象更多的时间。当Web服务返回的数据变为可用时,WebView仍未完成其加载的网页。因此,当我的客户端代码获得Web服务结果时,没有可以装饰的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 ...
            });
    }

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

傻,真的。