前言
大家应该都知道,代理方法的执行需要三个步骤:
第1步:需要代理遵循协议;
第2步:需要设置谁成为某个属性的代理;
第3步:需要实现该代理方法;
分析
在知道这三个步骤的前提下,对代理的基本使用基本没什么问题。
我在使用WKWebView控件时,需要计算内容的高度,就用到了如下代码方法
代理方法为
- (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation;
但是项目运行后,该代理方法就是不执行,所以肯定是以上三个步骤肯中的某个步骤出现了问题。
解决
经过仔细排查发现,原来步骤2出现了问题
。原因是WKWebView
有两个代理协议类型@protocol WKNavigationDelegate;
和@protocol WKUIDelegate;
属性如下:
/*! @abstract The web view's navigation delegate. */
@property (nullable, nonatomic, weak) id <WKNavigationDelegate> navigationDelegate;
/*! @abstract The web view's user interface delegate. */
@property (nullable, nonatomic, weak) id <WKUIDelegate> UIDelegate;
代码仅仅设置了self.webView.UIDelegate = self;
,而UIDelegate
是没有如上的代理方法的,如上代理方法是navigationDelegate
中的,因此必须写上self.webView.navigationDelegate = self;
这段代码。
这里很有简单拓展一下:
UIDelegate是WKUIDelegate类型的,即:
@property (nullable, nonatomic, weak) id <WKUIDelegate> UIDelegate;
。
WKUIDelegate协议里面的方法主要实现的是监听弹框的功能
navigationDelegate是WKNavigationDelegate类型的。即:
@property (nullable, nonatomic, weak) id <WKNavigationDelegate> navigationDelegate;
。WKNavigationDelegate协议里面的方法主要实现的是监听页面跳转以及监听页面加载的功能
。