ऐसा प्रतीत होता है कि WKWebView का backForwardList
केवल पढ़ने के लिए है, लेकिन मैंने लोगों को इसके आसपास जाने के लिए कुछ बहुत ही जादुई चीजें देखी हैं। मुझे WKWebView के इतिहास को साफ़ करने का कोई तरीका निकालने की ज़रूरत है। कोई विचार मैं ऐसा कैसे कर सकता हूं? अब तक मैंने कुछ तरकीबें आजमाई हैं जो विफल रही हैं:
- keyValue का उपयोग करना: forKey काम नहीं किया।
- C सूचक
->
का उपयोग करने से काम नहीं चला।
मैंने देखा है कि लोग संपत्ति को संश्लेषित करने और कक्षा का विस्तार करने के बारे में बात करते हैं लेकिन मैं वास्तव में नहीं जानता कि यह कैसे काम करता है और इसे समझ नहीं पाया। कोई अन्य विचार?
3 जवाब
यह कोड संकलित करता है, लेकिन मैंने इसका परीक्षण नहीं किया है ...
WKBackForwardList
के अपने उपवर्ग के साथ backForwardList
को ओवरराइड करने के लिए पहले मैं WKWebView
को उपवर्गित करता हूं।
फिर, मेरे WKBackForwardList
उपवर्ग में, मैं या तो backItem
और forwardItem
को ओवरराइड कर सकता हूं, ताकि उन्हें उनकी संबंधित सूची में देखने के बजाय शून्य वापस किया जा सके (जो कि संभवतः डिफ़ॉल्ट कार्यान्वयन है) .
या मैं backList
और forwardList
को उसी तरह से ओवरराइड कर सकता हूं जैसे मैंने WKWebView
में backForwardList
के साथ किया था। मैं इसे एक सेटर जोड़ने के लिए करता हूं, जो मुझे सूचियों से आइटम निकालने की अनुमति देगा।
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")
}
}
प्रलेखन में पढ़ना आप WKWebView के लिए WKBackForwardList प्राप्त कर सकते हैं। उसके बाद आप WKBackForwardList की बैकलिस्ट में पहला आइटम पा सकते हैं और उसके बाद उपयोग करने के लिए: func go(to: WKBackForwardListItem) -> WKNavigation?
और इससे आप पहले url तक की हिस्ट्री को क्लीन कर सकते हैं।
IOS8 ~ iOS11 पर वर्डेड।
उद्देश्य सी
#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")))
!!!!ध्यान दें!!!! यह विधि वेबकिट ओपन रिसोर्स में घोषित है, सार्वजनिक विधि नहीं。
संबंधित सवाल
जुड़े हुए प्रश्न
नए सवाल
ios
iOS, Apple iPhone, iPod टच और iPad पर चलने वाला मोबाइल ऑपरेटिंग सिस्टम है। IOS प्लेटफॉर्म पर प्रोग्रामिंग से संबंधित प्रश्नों के लिए इस टैग [ios] का उपयोग करें। उन प्रोग्रामिंग भाषाओं के लिए विशिष्ट मुद्दों के लिए संबंधित टैग [उद्देश्य-सी] और [स्विफ्ट] का उपयोग करें।