ऐसा प्रतीत होता है कि WKWebView का backForwardList केवल पढ़ने के लिए है, लेकिन मैंने लोगों को इसके आसपास जाने के लिए कुछ बहुत ही जादुई चीजें देखी हैं। मुझे WKWebView के इतिहास को साफ़ करने का कोई तरीका निकालने की ज़रूरत है। कोई विचार मैं ऐसा कैसे कर सकता हूं? अब तक मैंने कुछ तरकीबें आजमाई हैं जो विफल रही हैं:

  • keyValue का उपयोग करना: forKey काम नहीं किया।
  • C सूचक -> का उपयोग करने से काम नहीं चला।

मैंने देखा है कि लोग संपत्ति को संश्लेषित करने और कक्षा का विस्तार करने के बारे में बात करते हैं लेकिन मैं वास्तव में नहीं जानता कि यह कैसे काम करता है और इसे समझ नहीं पाया। कोई अन्य विचार?

8
Chet 7 सितंबर 2017, 04:51

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")
    }
}
2
nyg 7 सितंबर 2017, 11:53

प्रलेखन में पढ़ना आप WKWebView के लिए WKBackForwardList प्राप्त कर सकते हैं। उसके बाद आप WKBackForwardList की बैकलिस्ट में पहला आइटम पा सकते हैं और उसके बाद उपयोग करने के लिए: func go(to: WKBackForwardListItem) -> WKNavigation? और इससे आप पहले url तक की हिस्ट्री को क्लीन कर सकते हैं।

0
m1sh0 10 जुलाई 2018, 18:36

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")))

!!!!ध्यान दें!!!! यह विधि वेबकिट ओपन रिसोर्स में घोषित है, सार्वजनिक विधि नहीं。

5
xu tong 19 अक्टूबर 2017, 11:31