如何清除WKWebView的WKBackForwardList?
看起来backForwardList
的backForwardList是只读的,但是我看到人们有一些非常神奇的东西来解决这个问题。 我需要找出一些清除WKWebView历史的方法。 任何想法我怎么可能这样? 到目前为止,我尝试了一些失败的技巧:
- 使用keyValue:forKey不起作用。
- 使用C指针
->
没有用。
我已经看到人们谈论合成属性和扩展课程,但我真的不知道它是如何工作的,无法弄明白。 还有其他想法吗?
这段代码编译,但我没有测试过…
首先,我将backForwardList
子类WKWebView
使用我自己的WKBackForwardList
子类覆盖WKBackForwardList
。
然后,在我的WKBackForwardList
子类中,我可以覆盖backItem
和forwardItem
以使它们返回nil,而不是让它们查看它们各自的列表(这很可能是默认实现)。
或者我可以像在WKWebView
使用backForwardList
一样覆盖backList
和forwardList
。 我这样做是为了添加一个setter,这将允许我从列表中删除项目。
import Foundation import WebKit class WebViewHistory: WKBackForwardList { /* Solution 1: return nil, discarding what is in backList & forwardList */ override var backItem: WKBackForwardListItem? { return nil } override var forwardItem: WKBackForwardListItem? { return nil } /* Solution 2: override backList and forwardList to add a setter */ var myBackList = [WKBackForwardListItem]() override var backList: [WKBackForwardListItem] { get { return myBackList } set(list) { myBackList = list } } func clearBackList() { backList.removeAll() } } class WebView: WKWebView { var history: WebViewHistory override var backForwardList: WebViewHistory { return history } init(frame: CGRect, configuration: WKWebViewConfiguration, history: WebViewHistory) { self.history = history super.init(frame: frame, configuration: configuration) } /* Not sure about the best way to handle this part, it was just required for the code to compile... */ required init?(coder: NSCoder) { if let history = coder.decodeObject(forKey: "history") as? WebViewHistory { self.history = history } else { history = WebViewHistory() } super.init(coder: coder) } override func encode(with aCoder: NSCoder) { super.encode(with: aCoder) aCoder.encode(history, forKey: "history") } }
关注iOS8~iOS11。
Objective-C的
#pragma clang diagnostic push #pragma clang diagnostic ignored "-Warc-performSelector-leaks" [wek.backForwardList performSelector:NSSelectorFromString(@"_removeAllItems")]; #pragma clang diagnostic pop
斯威夫特4
webView.backForwardList.perform(Selector(("_removeAllItems")))
!!!!注意!!!! 这种方法在WebKit Open Resource中声明,而不是公共方法。
阅读文档,您可以获得WKWebView的WKBackForwardList。 之后你可以找到WKBackForwardList的backList中的第一个项目,然后使用: func go(to: WKBackForwardListItem) -> WKNavigation?
有了这个,你可以清理历史到第一个url。