13.3.2 WKNavigationDelegate
我们会发现上例中如果点击了某个页面之后就再也无法回到之前的页面了,这时候需要Navigation Controller作为视图控制器来进行页面跳转的控制。如图13.3.6所示,使用一个Navigation Controller作为应用开始的视图控制器,并且用Main.storyboard中已有的View Controller作为Navigation Controller的根视图控制器。
图13.3.6 为WebKit View增加Navigation Controller
然后为导航栏增加一个UIBarButtonItem,如图13.3.7所示:
图13.3.7 Bar Button Item
在Object Library中找出这个Item,并将其拖拽至Storyboard中,放在View Controller中的Navigation Item下,如图13.3.8所示:
图13.3.8 将Bar Button Item放入Navigation Item的Left Bar Button Items中
在Bar Button Item的Attributes Inspector中将title改为“返回”,如图13.3.9所示:
图13.3.9 Bar Button Item的Attributes Inspector
为这个Bar Button Item增加属性和方法的链接,代码如下:
动手写13.3.2 WKWebViewPractise->ViewController.swift在goBackWeb函数中调用WKWebView的goBack函数,返回上一页,代码如下:
动手写13.3.3 WKWebViewPractise->ViewController.swift
运行模拟器,WKWebView被套在了一个Navigation Controller之下,如图13.3.10所示:
图13.3.10 带有Navigation Bar的WKWebView
此时如果跳转到其他页面后再点击返回,就可以返回到首页了。但在首页就能使用返回按钮会让用户感到困惑,所以一开始应该将其设置为disable,当页面进行跳转之后再设置为enable,并且在返回到首页之后再次设置为disable。
这个时候需要借助WKNavigationDelegate协议,从这个协议的名字就能看出它就是为了WKWebView导航而创建的,代码如下:
动手写13.3.4 WKWebViewPractise->ViewController.swift
选择了webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)作为判断返回按钮是否可用的协议函数,这个协议函数会在WKWebView页面跳转完成之后被回调。此时检查backForwardList中的backItem是否为nil,如果不是,说明可以返回,就将返回按钮设置为enable的状态。
WKNavigationDelegate中还有如下的协议函数:
通过函数名,苹果已经告诉开发者这些方法将会在什么时候调用。如果需要知道具体调用的准确时机,读者可以自己实现这些方法,并进行调试。