इंटरफ़ेस बिल्डर में WKWebView


95

ऐसा लगता है कि XCode 6 बीटा में आईबी ऑब्जेक्ट टेम्पलेट अभी भी पुरानी शैली की वस्तुओं (iOS के लिए UIWebView और OSX के लिए WebView) का निर्माण कर रहे हैं। उम्मीद है कि Apple उन्हें आधुनिक WebKit के लिए अपडेट करेगा, लेकिन तब तक, इंटरफ़ेस बिल्डर में WKWebViews बनाने का सबसे अच्छा तरीका क्या है? क्या मुझे एक मूल दृश्य (UIView या NSView) बनाना चाहिए और WKWebView को इसका प्रकार निर्दिष्ट करना चाहिए? अधिकांश उदाहरण जो मुझे ऑनलाइन मिले हैं, वे इसे एक कंटेनर दृश्य में प्रोग्रामेटिक रूप से जोड़ते हैं; क्या यह किसी कारण से बेहतर है?


3
यह अभी भी एक खुला बग है: lists.webkit.org/pipermail/webkit-unassigned/2014-Se/t/-
डेविड एच

4
मैं Xcode 7.2 का उपयोग कर रहा हूं, मैं ऑब्जेक्ट लाइब्रेरी में WKWebView नहीं देखता हूं। क्या यह अभी भी उपलब्ध नहीं है?
user3731622

10
अभी भी एक्सकोड 8. में मौजूद नहीं है
रयान बैलेन्टिन

1
Xcode 9.0.1 अब IB में WKWebView का समर्थन करता है। यहाँ सभी उत्तरों को अब हटा दिया गया है।
मुस्कानबोट

1
@smileBot Xcode के नए संस्करण में WKWebView है, लेकिन इसके लिए आपको iOS 11+ को लक्षित करना होगा। crx_au उत्तर सबसे अच्छा काम करता है -> stackoverflow.com/a/40118654/757503
mikemike396

जवाबों:


70

आप सही हैं - यह काम नहीं करता है। यदि आप हेडर में देखते हैं, तो आप देखेंगे:

- (instancetype)initWithCoder:(NSCoder *)coder NS_UNAVAILABLE;

जिसका तात्पर्य यह है कि आप किसी को एक निब से नहीं रोक सकते।

आपको इसे viewDidLoad या loadView में हाथ से करना होगा।


उम्मीद है कि वे इसे किसी बिंदु पर बदल देंगे, लेकिन मुझे लगता है कि यह कोई बड़ी बात नहीं है। जोहान ने मुझे वापस WWDC वीडियो की ओर इशारा किया, और यहां तक ​​कि वे कोड में तत्काल कर रहे हैं।
एडम फॉक्स

3
प्लस साइड पर, इसे कोड में करने से आप iOS 7 में UIWebView और iOS 8 में WKWebView का उपयोग कर सकते हैं
EricS

इस जवाब के बाद, मुझे लगता है कि आप इस विधि को WKWebView के उपवर्ग में ओवरराइड कर सकते हैं और फिर इसे इंटरफ़ेस बिल्डर में उपयोग कर सकते हैं .. लेकिन बिना सुपर.इनविटवॉकर के .. चलो परीक्षण करें! :)
ज़ारगोल

1
एक व्यक्तिगत परीक्षण के बाद: आप नहीं कर सकते हैं ... "ओवरराइड नहीं कर सकते 'जो कि अनुपलब्ध के रूप में चिह्नित किया गया है" बहुत बुरा है ...
zarghol

2
ऐसा करने के लिए एक उचित बात यह हो सकती है कि MyWebView नामक एक UIView सबव्यू बनाएं जिसमें एक WKWebView या UIWebView एक सबव्यू के रूप में है, जो initWithCoder में रनटाइम पर निर्धारित किया गया है। तब आप IB में MyWebView विचार बना सकते हैं। यदि आप स्विफ्ट का उपयोग कर रहे हैं, तो आप उन संपत्तियों को भी जोड़ सकते हैं जिन्हें आईबी में IBInspectable कीवर्ड का उपयोग करके संपादित किया जा सकता है।
एरिकस

65

जैसा कि कुछ ने बताया, Xcode 6.4 के रूप में, WKWebView अभी भी इंटरफ़ेस बिल्डर पर उपलब्ध नहीं है। हालांकि, कोड के माध्यम से उन्हें जोड़ना बहुत आसान है।

मैं सिर्फ अपने ViewController में इस का उपयोग कर रहा हूँ। स्किपिंग इंटरफ़ेस बिल्डर

import UIKit
import WebKit

class ViewController: UIViewController {

    private var webView: WKWebView?

    override func loadView() {
        webView = WKWebView()

        //If you want to implement the delegate
        //webView?.navigationDelegate = self

        view = webView
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        if let url = URL(string: "https://google.com") {
            let req = URLRequest(url: url)
            webView?.load(req)
        }
    }
}

13
यह प्रश्न विशेष रूप से इंटरफ़ेस बिल्डर के बारे में है, इसलिए यह उत्तर बहुत उपयोगी नहीं है।
स्टीव लांडे

5
तुम सही हो। मुझे "आप आईबी से WKWebView नहीं बना सकते हैं" के साथ जवाब देना शुरू कर देना चाहिए था :) :) लेकिन मैं WWDC से सत्र वीडियो "आधुनिक WebKit एपीआई का परिचय" देख रहा हूं और वे Xcode का उपयोग कर रहे हैं, इसलिए मुझे लगता है कि यह सिर्फ कुछ है। वर्तमान में हमारे लिए उपलब्ध टी।
जोहान

1
बस फिर से वीडियो की जाँच की, और वे कोड में अपने WKWebView को इंस्टेंट कर रहे हैं। यह वीडियो में लगभग 17:20 का निशान है।
एडम फॉक्स

3
यह एक अनंत लूप कैसे बनाएगा? यह iOS दस्तावेज़ीकरण में loadView के विवरण से है। "दृश्य नियंत्रक इस पद्धति को तब कॉल करता है जब इसकी दृश्य संपत्ति का अनुरोध किया जाता है, लेकिन वर्तमान में शून्य है।"
जोहान २

2
self.viewअंदर संदर्भितloadView() करने से अनंत पुनरावृत्ति होती है। दूसरी ओर, दृश्य सेट करना न केवल अनुमत है, बल्कि वास्तव में आवश्यक है (मैन्युअल रूप से, याsuperइसकेलिए जंजीर से। अन्यथा इसे तब तक कहा जाता रहेगा, जब तक दृश्य हैnil)।
निकोलस मिआरी

29

Info.plist

अपने Info.plist परिवहन सुरक्षा सेटिंग में जोड़ें

 <key>NSAppTransportSecurity</key>
 <dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
 </dict>

Xcode 9.1+

इंटरफ़ेस बिल्डर का उपयोग करना

आप ऑब्जेक्ट लाइब्रेरी में WKWebView तत्व पा सकते हैं।

यहां छवि विवरण दर्ज करें

प्रोग्राम को स्विफ्ट 5 के साथ देखें

let webView = WKWebView(frame: .zero, configuration: WKWebViewConfiguration())
view.addSubview(webView)
webView.translatesAutoresizingMaskIntoConstraints = false
webView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
webView.rightAnchor.constraint(equalTo: view.safeAreaLayoutGuide.rightAnchor).isActive = true
webView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
webView.leftAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leftAnchor).isActive = true

प्रोग्राम को स्विफ्ट 5 (पूर्ण नमूना) के साथ देखें

import UIKit
import WebKit

class ViewController: UIViewController {

    private weak var webView: WKWebView!

    override func viewDidLoad() {
        super.viewDidLoad()
        initWebView()
        webView.loadPage(address: "http://apple.com")
    }

    private func initWebView() {
        let webView = WKWebView(frame: .zero, configuration: WKWebViewConfiguration())
        view.addSubview(webView)
        self.webView = webView
        webView.translatesAutoresizingMaskIntoConstraints = false
        webView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true
        webView.rightAnchor.constraint(equalTo: view.safeAreaLayoutGuide.rightAnchor).isActive = true
        webView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor).isActive = true
        webView.leftAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leftAnchor).isActive = true
    }
}

extension WKWebView {
    func loadPage(address url: URL) { load(URLRequest(url: url)) }
    func loadPage(address urlString: String) {
        guard let url = URL(string: urlString) else { return }
        loadPage(address: url)
    }
}

इसके लिए इनिशियलाइज़र में एक नया दृष्टिकोण आवंटित करना एक अच्छा सुझाव नहीं है WebView। crx_au की प्रतिक्रिया बेहतर है
इलियास करीम

मुझे कोई और काम नहीं मिला है !! इसलिए ... जैसा कि ILI4S ने कहा कि शायद यह एक अच्छा सुझाव नहीं है, मुझे नहीं पता कि यह है या नहीं, लेकिन ठीक से काम करता है! धन्यवाद आदमी, आपने मेरा दिन बचा लिया !! :)
जॉर्ज कोरडेरो

20

Xcode 8 के साथ यह अब संभव है, लेकिन इसे प्राप्त करने का साधन कम से कम कहने के लिए थोड़ा हैकी है। लेकिन हे, एक काम समाधान एक काम कर समाधान है, है ना? मुझे समझाने दो।

WKWebView का initWithCoder: अब "NS_UNAVAILABLE" के रूप में एनोटेट नहीं किया जाता है। यह अब नीचे दिखाया गया है।

- (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER;

WKWebView को ओवरक्लास करके शुरू करें और initWithCoder को ओवरराइड करें। सुपर initWithCoder को कॉल करने के बजाय, आपको initWithFrame: कॉन्फ़िगरेशन: जैसे एक अलग init पद्धति का उपयोग करने की आवश्यकता होगी। त्वरित उदाहरण नीचे।

- (instancetype)initWithCoder:(NSCoder *)coder
{
    // An initial frame for initialization must be set, but it will be overridden 
    // below by the autolayout constraints set in interface builder. 
    CGRect frame = [[UIScreen mainScreen] bounds];
    WKWebViewConfiguration *myConfiguration = [WKWebViewConfiguration new];

    // Set any configuration parameters here, e.g.
    // myConfiguration.dataDetectorTypes = WKDataDetectorTypeAll; 

    self = [super initWithFrame:frame configuration:myConfiguration];

    // Apply constraints from interface builder.
    self.translatesAutoresizingMaskIntoConstraints = NO;

    return self;
}

अपने स्टोरीबोर्ड में, एक UIView का उपयोग करें और इसे अपने नए उपवर्ग का एक कस्टम वर्ग दें। बाकी हमेशा की तरह व्यवसाय है (ऑटो-लेआउट की बाधाओं को स्थापित करना, एक नियंत्रक में आउटलेट के दृश्य को जोड़ना, आदि)।

अंत में, WKWebView UIWebView को अलग तरह से सामग्री देता है। बहुत से लोग संभवतः WKWebView को दबाने के लिए WWWebView को स्केलिंग कंटेंट से समान आवर्धन पर प्रस्तुत करना चाहते हैं क्योंकि UIWebView इस संबंध में UIWebView व्यवहार का अधिक बारीकी से पालन करता है।


2
self = [super initWithFrame:myFrame configuration:myConfiguration];यदि आप बाधाओं का उपयोग करते हैं तो यह भी पढ़ना चाहिए , सेट करना न भूलेंself.translatesAutoresizingMaskIntoConstraints = NO;
Mojo66

प्लेसहोल्डर फ़्रेम के रूप में मुख्य स्क्रीन की सीमाओं का उपयोग करने के बजाय, आप हमें CGRectZero भी बना सकते हैं और अपने आप को कुछ कोड सहेज सकते हैं।
इलियास करीम

अच्छा समाधान। अच्छा काम करता है।
रेफ़लेक

निर्दोष रूप से काम करता है! स्टोरीबोर्ड में WKWebView बाधाओं को प्राप्त करने के लिए iOS 11 को लक्षित नहीं करने के लिए अच्छा फिक्स।
mikemike396

20

यहाँ crx_au के उत्कृष्ट उत्तर पर आधारित एक सरल स्विफ्ट 3 संस्करण है ।

import WebKit

class WKWebView_IBWrapper: WKWebView {
    required convenience init?(coder: NSCoder) {
        let config = WKWebViewConfiguration()
        //config.suppressesIncrementalRendering = true //any custom config you want to add
        self.init(frame: .zero, configuration: config)
        self.translatesAutoresizingMaskIntoConstraints = false
    }
}

इंटरफ़ेस बिल्डर में एक UIView बनाएं, अपनी बाधाओं को असाइन करें, और इसे WKWebView_IBWrapperकस्टम वर्ग के रूप में असाइन करें , जैसे:

उपयोगिताएँ -> पहचान निरीक्षक टैब [1]


उत्कृष्ट उत्तर
अमर होसम

6

यदि आप अभी भी Xcode के हाल के संस्करणों में इस मुद्दे का सामना करते हैं, अर्थात v9.2 +, तो बस अपने ViewController के लिए वेबकिट आयात करें:

#import <WebKit/WebKit.h>
  1. तय होने से पहले: यहां छवि विवरण दर्ज करें

  2. तय होने के बाद:

यहां छवि विवरण दर्ज करें


4

यह अब जाहिरा तौर पर Xcode 9b4 में तय हो गया है। रिलीज़ नोट्स कहते हैं "WKWebView iOS ऑब्जेक्ट लाइब्रेरी में उपलब्ध है।"

मैंने यह देखने के लिए गहराई से नहीं देखा कि क्या इसके लिए iOS 11 की आवश्यकता है या अभी तक पिछड़े हुए संगत हैं।


मैं पुष्टि कर सकता हूं कि यह काम करता है! हुर्रे! यह macOS स्टोरीबोर्ड में काम करता है (कम से कम macOS 10.13+ को लक्षित करने वाले ऐप्स के लिए)।
क्लिफ्टन लैब्रुम

1

आप Xcode 9 के बाद से IB में WKWebView को तत्काल कॉन्फ़िगर और कॉन्फ़िगर कर सकते हैं, इसे कोड में करने की कोई आवश्यकता नहीं है। यहां छवि विवरण दर्ज करें

ध्यान दें कि आपका परिनियोजन लक्ष्य iOS 10 से अधिक होना चाहिए, हालांकि या आपको एक संकलन-समय त्रुटि मिलेगी।

यहां छवि विवरण दर्ज करें


0

XCode संस्करण में 9.0.1 WKWebView इंटरफ़ेस बिल्डर पर उपलब्ध है।



0

यकीन नहीं होता कि यह मदद करता है, लेकिन मैंने लक्ष्य के लिए WebKit फ्रेमवर्क को शामिल करके मेरे लिए समस्या को हल कर दिया। इसे एम्बेड न करें केवल संदर्भ लिंक करें। मैं अभी भी IB में WebView ऑब्जेक्ट का उपयोग करता हूं और इसे ViewController पर छोड़ता हूं जिसे मैं इसमें एम्बेड कर रहा हूं और मुझे कभी कोई समस्या नहीं हुई ...

मैंने अभी 4 WKWebView MacOS प्रोजेक्ट्स पर काम किया है और प्रत्येक प्रोजेक्ट में WebView ने ठीक से काम किया है।


-14

यह मेरे लिए Xcode 7.2 में काम किया ...

सबसे पहले स्टोरीबोर्ड / आईबी में UIWebView आउटलेट के रूप में वेब दृश्य जोड़ें। यह आपको इस तरह से एक संपत्ति देगा:

@property (weak, nonatomic) IBOutlet UIWebView *webView;

फिर इसे WKWebView में बदलने के लिए बस अपना कोड संपादित करें।

@property (weak, nonatomic) IBOutlet WKWebView *webView;

आपको पहचानकर्ता निरीक्षक में कस्टम वर्ग को WKWebView में भी बदलना चाहिए।


मैंने OS X प्रोजेक्ट के साथ यह कोशिश की - जो काम नहीं करता है, इसलिए यह iOS के लिए विशेष मामला होना चाहिए।
हेनरिकस्ट्रोम

2
आप जो करते हैं वह सिर्फ टाइप-कास्ट की तरह है। यह webView के प्रकार को बिल्कुल नहीं बदल सकता है।
डॉनसॉन्ग
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.