我是Xamarin和iOS的新手,我正在整理一个小型的POC应用程序来学习。
该应用程序使用带有UIWebView的视图。我打算将本地Web文件加载到其中,然后使用JavaScript和C#(JS桥)混合操作,但UIWebView无法正常运行。它根本不加载页面。如果我卸载应用程序然后重新安装并运行它,它通常会成功加载网页,但在后续会话中,网页通常不会加载,将Web视图保留为白色空白区域。我只是想确保加载了众所周知的网页,例如xamarin.com或apple.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模拟器在页面(未能)加载后的样子:
答案 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 ...
});
}
我所要做的就是等待网页完成加载,一切似乎都有效。我只是从我所看到的内容中得出了错误的结论。
傻,真的。