【问题标题】:Xamarin iOS WKWebView DidFinishNavigation and DidStartProvisionalNavigation not getting calledXamarin iOS WKWebView DidFinishNavigation 和 DidStartProvisionalNavigation 没有被调用
【发布时间】:2016-04-20 20:19:18
【问题描述】:

我正在 iOS Xamarin 中实现 WKWebView,我想在加载开始和加载完成时做一些事情。我已经实现了 IWKNavigationDelegate 并添加了以下函数,但没有一个被调用。我错过了什么

类定义

 public partial class MasterViewController : UIViewController,IScanSuccessCallback, IWKScriptMessageHandler, IWKNavigationDelegate
{ }

导航委托功能

    public void DidFinishNavigation(WKWebView webView, WKNavigation navigation)
    {
        Console.WriteLine ("DidFinishNavigation");
    }

    public void DidFailNavigation( WKWebView webView, WKNavigation navigation, NSError error )
    {
        // If navigation fails, this gets called
        Console.WriteLine("DidFailNavigation");
    }
    public void DidFailProvisionalNavigation( WKWebView webView, WKNavigation navigation, NSError error )
    {
        // If navigation fails, this gets called
        Console.WriteLine("DidFailProvisionalNavigation");
    }
    public void DidStartProvisionalNavigation( WKWebView webView, WKNavigation navigation )
    {
        // When navigation starts, this gets called
        Console.WriteLine("DidStartProvisionalNavigation");
    }

【问题讨论】:

  • 您是否将委托类分配给您的 WKWebView 实例?
  • 我有 - IWKNavigationDelegate 如上所述。我如何将委托类分配给 WKWebView

标签: xamarin xamarin.ios wkwebview


【解决方案1】:

补充杰森的回答。

您缺少可选委托方法所需的ExportAttribute,当Foo 是ObjC 委托并且您键入override(它应该列出可选的而不是可选的成员)。 ExportAttribute 只有可选成员(c#接口中的非抽象成员)才需要。

在这种特殊情况下,WKNavigationDelegate ObjC 协议的所有成员都是可选的,因此您需要 Export 属性和 ObjC 选择器作为其参数。

你需要将using Foundation添加到你的using语句中,ExportAttribute在里面。

[Export ("webView:didFinishNavigation:")]
public void DidFinishNavigation(WKWebView webView, WKNavigation navigation)
{
    Console.WriteLine ("DidFinishNavigation");
}

[Export ("webView:didFailNavigation:withError:")
public void DidFailNavigation( WKWebView webView, WKNavigation navigation, NSError error )
{
    // If navigation fails, this gets called
    Console.WriteLine("DidFailNavigation");
}

[Export ("webView:didFailProvisionalNavigation:withError:")]
public void DidFailProvisionalNavigation( WKWebView webView, WKNavigation navigation, NSError error )
{
    // If navigation fails, this gets called
    Console.WriteLine("DidFailProvisionalNavigation");
}

[Export ("webView:didStartProvisionalNavigation:")]
public void DidStartProvisionalNavigation( WKWebView webView, WKNavigation navigation )
{
    // When navigation starts, this gets called
    Console.WriteLine("DidStartProvisionalNavigation");
}

希望这会有所帮助。

【讨论】:

  • 我认为混淆的来源之一是有时委托是类,有时(如这里)被实现为接口。此外,文档说(关于 IWKNavigationDelegate):“如果开发人员创建实现此接口的类,则实现方法将自动导出到 Objective-C,并使用 WKNavigationDelegate 协议中定义的方法的匹配签名”。事实上,它被视为一个 WeakDelegate
  • 我已尝试以与您相同的方式添加导出,但仍然没有命中 DidFinishNavigation。如果您能提供帮助,请查看我的问题:stackoverflow.com/q/63578856/9401556
【解决方案2】:

您需要将 NavigationDelegate 类显式分配给 webview

WKWebView web = new WKWebView();

// if the current class implements IWKNavigationDelegate, you can do this
web.NavigationDelegate = this;

// or you can create a separate class that implements IWKNavigationDelegate
web.NavigationDelegate = new MyWebDelegate();

【讨论】:

  • 我已经做了 // 如果当前类实现了IWKNavigationDelegate,你可以这样做 web.NavigationDelegate = this;但仍然没有调用方法
  • 您好,Jason,我已经按照您的方式尝试过了,但 DidFinishNavigation 仍然没有被点击。您能否检查我的问题的以下答案。我已经尝试过了,但现在正在显示一个白页。谢谢。 stackoverflow.com/a/63579635/9401556
猜你喜欢
  • 2014-12-09
  • 1970-01-01
  • 2011-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
  • 2014-12-10
  • 1970-01-01
相关资源
最近更新 更多