我是 Xamarin 和 iOS 的新手。我正在尝试在 Xamarin Forms 中创建一个自定义渲染器来渲染 WkWebView。我希望当用户点击 web View 中的链接时调用我的 DidStartProvisionalNavigation()
方法,但那没有发生,我不知道为什么。我正在尝试使用 Xlab 的 HybridViewRender作为引用。有人能告诉我如何让 WkWebView 在用户点击链接时调用 DidStartProvisionalNavigation()
吗?谢谢
这是我使用 WkWebView 的自定义 IOS 渲染器的源代码。
public class HybridWebViewRenderer : ViewRenderer<HybridWebView, WKWebView>, IWKScriptMessageHandler
{
const string JavaScriptFunction = "function invokeCSharpAction(data){window.webkit.messageHandlers.invokeAction.postMessage(data);}";
WKUserContentController userController;
protected override void OnElementPropertyChanged(object sender, PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (e.PropertyName == "Uri")
Control.LoadRequest (new NSUrlRequest (new NSUrl (Element.Uri)));
}
protected override void OnElementChanged (ElementChangedEventArgs<HybridWebView> e)
{
base.OnElementChanged (e);
if (Control == null) {
userController = new WKUserContentController ();
var script = new WKUserScript (new NSString (JavaScriptFunction), WKUserScriptInjectionTime.AtDocumentEnd, false);
userController.AddUserScript (script);
userController.AddScriptMessageHandler (this, "invokeAction");
var config = new WKWebViewConfiguration { UserContentController = userController };
config.ApplicationNameForUserAgent += " MethodApp";
var webView = new WKWebView (Frame, config);
SetNativeControl (webView);
}
if (e.OldElement != null) {
userController.RemoveAllUserScripts ();
userController.RemoveScriptMessageHandler ("invokeAction");
var hybridWebView = e.OldElement as HybridWebView;
e.OldElement.onRefresh -= Refresh;
hybridWebView.Cleanup ();
}
if (e.NewElement != null) {
e.NewElement.onRefresh += Refresh;
//string fileName = Path.Combine (NSBundle.MainBundle.BundlePath, string.Format ("Content/{0}", Element.Uri));
if (Element.Uri != null)
Control.LoadRequest (new NSUrlRequest (new NSUrl (Element.Uri)));
}
}
public void Refresh(object sender, EventArgs ea) {
Control.Reload();
}
public void DidReceiveScriptMessage (WKUserContentController userContentController, WKScriptMessage message)
{
Element.InvokeAction (message.Body.ToString ());
}
[Export("webView:didStartProvisionalNavigation:")]
public void DidStartProvisionalNavigation(WKWebView webView, WKNavigation navigation)
{
Element.OnNavigating(webView.Url);
}
}
最佳答案
你只需要添加这一行:
webView.NavigationDelegate = this;
代码之后:
var webView = new WKWebView (Frame, config);
也不要忘记更改:
public class HybridWebViewRenderer : ViewRenderer< HybridWebView,WKWebView>, IWKScriptMessageHandler, IWKNavigationDelegate
之后,您可以使用并覆盖 DidStartProvisionalNavigation 代码:
[Export("webView:didStartProvisionalNavigation:")]
public void DidStartProvisionalNavigation(WKWebView webView,WKNavigation navigation)
{
// When navigation starts, this gets called
Console.WriteLine("DidStartProvisionalNavigation");
}
关于ios - 监听 WkWebView 的导航事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36436217/