Arayüz Oluşturucu'da WKWebView


95

Görünüşe göre XCode 6 beta'daki IB nesne şablonları hala eski tarz nesneler oluşturuyor (iOS için UIWebView ve OSX için WebView). Umarım Apple bunları modern WebKit için günceller, ancak o zamana kadar Interface Builder'da WKWebViews oluşturmanın en iyi yolu nedir? Temel bir görünüm (UIView veya NSView) oluşturmalı ve türünü WKWebView'a atamalı mıyım? Çevrimiçi bulduğum örneklerin çoğu, onu programlı olarak bir kapsayıcı görünümüne ekler; bu nedense daha mı iyi?



4
Xcode 7.2 kullanıyorum, nesne kitaplığında WKWebView görmüyorum. Hala mevcut değil mi?
user3731622

10
Hala Xcode 8'de yok.
Ryan Ballantyne

1
Xcode 9.0.1 artık IB'de WKWebView'ı desteklemektedir. Buradaki tüm yanıtlar artık kullanımdan kaldırılmıştır.
smileBot

1
@smileBot Xcode'un yeni sürümü WKWebView'a sahip ancak iOS 11+ hedeflemenizi gerektiriyor. crx_au cevabı en iyi sonucu verir -> stackoverflow.com/a/40118654/757503
mikemike396

Yanıtlar:


70

Haklısın - işe yaramıyor gibi görünüyor. Başlıklara bakarsanız şunları görürsünüz:

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

bu da bir uçtan bir tanesini başlatamayacağınız anlamına gelir.

Bunu viewDidLoad veya loadView'da elle yapmanız gerekecektir.


Umarım bir noktada bunu değiştirirler, ama sanırım bu önemli bir şey değil. Johan beni WWDC videosuna işaret etti ve onlar bile kodda somutlaştırıyorlar.
Adam Fox

3
Artı tarafta, kod içinde yapmak, iOS 7'de UIWebView ve iOS 8'de WKWebView kullanmanıza izin verecektir.
EricS

Bu yanıttan sonra, sanırım bu yöntemi bir WKWebView alt sınıfında geçersiz kılabilirsiniz ve sonra onu arayüz oluşturucuda kullanabilirsiniz .. ancak super.initWithCoder olmadan .. Hadi test edelim! :)
zarghol

1
Kişisel bir testten sonra: yapamazsınız ... "Kullanılamıyor olarak işaretlenmiş '
init'i geçersiz kılamazsınız

2
Yapılması gereken makul bir şey, initWithCoder'de çalışma zamanında belirlenen bir alt görünüm olarak WKWebView veya UIWebView olan MyWebView adlı bir UIView alt görünümü oluşturmak olabilir. Ardından IB'de MyWebView görünümleri oluşturabilirsiniz. Swift kullanıyorsanız, IBInspectable anahtar sözcüğünü kullanarak IB'de düzenlenebilecek özellikler bile ekleyebilirsiniz.
EricS

65

Bazılarının işaret ettiği gibi, Xcode 6.4 itibariyle, WKWebView hala Arabirim Oluşturucu'da mevcut değildir. Ancak bunları kod aracılığıyla eklemek çok kolaydır.

Bunu sadece ViewController'imde kullanıyorum. Arayüz oluşturucuyu atlama

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
Bu soru özellikle Arayüz Oluşturucu ile ilgilidir, bu nedenle bu cevap pek yardımcı olmaz.
Steve Landey

5
Haklısın. Cevaba "IB'den WKWebView oluşturamazsınız" şeklinde başlamalıydım :) Ama WWDC'den "Modern WebKit API Tanıtımı" oturum videosunu izliyorum ve Xcode kullanıyorlar, bu yüzden sanırım bu sadece bir şey değil ' t şu anda bizim için mevcut.
Johan

1
Sadece videoyu tekrar kontrol ettiler ve WKWebView'larını kodda başlatıyorlar. Videoda 17:20 civarında.
Adam Fox

3
Nasıl sonsuz bir döngü yaratacak? Bu, iOS belgelerindeki loadView açıklamasından alınmıştır. "Görünüm denetleyicisi, görünüm özelliği istendiğinde ancak şu anda sıfır olduğunda bu yöntemi çağırır."
Johan

2
Başvuruda self.view içiniloadView()sonsuz özyinelemeye yol açar şeydir. Öte yandan, görünümün ayarlanmasına izin vermekle kalmaz, gerçekten de gereklidir (manuel olarak veya zincirleme ilesuper. Aksi takdirde, görünüm olduğu sürece çağrılmaya devam edernil).
Nicolas Miari

30

Info.plist

Info.plist aktarım güvenlik ayarınıza ekleyin

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

Xcode 9.1+

Arayüz oluşturucuyu kullanma

WKWebView öğesini Nesne kitaplığında bulabilirsiniz.

görüntü açıklamasını buraya girin

Swift 5 ile programlı bir şekilde görünüm ekleyin

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

Swift 5 ile programlı bir şekilde görünüm ekleyin (tam örnek)

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

Başlatıcıda yeni bir görünüm tahsis etmek iyi bir öneri değildir WebView. crx_au'nun yanıtı üstün
Karim

Çalışan başka bir şey bulamadım !! Yani ... ILI4S'in dediği gibi belki bu iyi bir öneri değil, olup olmadığını bilmiyorum ama düzgün çalışıyor! Teşekkürler dostum, günümü kurtardın !! :)
Jorge Cordero

20

Xcode 8 ile bu artık mümkün, ancak bunu başarmanın yolu en azını söylemek biraz zor. Ama hey, çalışan bir çözüm çalışan bir çözümdür, değil mi? Açıklamama izin ver.

WKWebView initWithCoder: artık "NS_UNAVAILABLE" olarak açıklamalı değil. Şimdi aşağıda gösterildiği gibi görünüyor.

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

WKWebView'ı alt sınıflayarak başlayın ve initWithCoder'ı geçersiz kılın. Super initWithCoder'ı çağırmak yerine, initWithFrame: configuration: gibi farklı bir init yöntemi kullanmanız gerekecektir. Aşağıdaki hızlı örnek.

- (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;
}

Storyboard'unuzda bir UIView kullanın ve ona yeni alt sınıfınızın özel bir sınıfını verin. Gerisi her zamanki gibi iştir (otomatik düzen kısıtlamalarının ayarlanması, görünümü bir denetleyicideki bir prize bağlama vb.).

Son olarak, WKWebView, içeriği UIWebView'dan farklı şekilde ölçeklendirir. Pek çok kişi, WKWebView'ün bu bağlamda UIWebView davranışını daha yakından takip etmesini sağlamak için, UIWebView ile aynı büyütme oranını oluşturmak için içeriği ölçeklendirmekten WKWebView'daki basit tavsiyeleri takip etmek isteyecektir .


2
self = [super initWithFrame:myFrame configuration:myConfiguration];Kısıtlama kullanıyorsanız da okumalıdır , ayarlamayı unutmayınself.translatesAutoresizingMaskIntoConstraints = NO;
Mojo66

Ana ekranın sınırlarını bir yer tutucu çerçeve olarak kullanmak yerine, CGRectZero'yu kullanabilir ve kendinize biraz kod kaydedebilirsiniz.
İlias Karim

Güzel çözüm. İyi çalışıyor.
Rayfleck

Kusursuz çalışır! Film şeridinde WKWebView kısıtlamalarını almak için iOS 11'i Hedeflemek zorunda kalmamak için güzel bir düzeltme.
mikemike396

20

İşte crx_au'nun mükemmel cevabına dayanan basit bir Swift 3 sürümü .

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
    }
}

Interface Builder'da bir UIView oluşturun, kısıtlamalarınızı atayın ve aşağıdaki WKWebView_IBWrappergibi özel bir sınıf olarak atayın :

Yardımcı Programlar -> Identity Inspector Sekmesi [1]


Mükemmel cevap
Amr Hossam

6

Xcode'un son sürümlerinde, yani v9.2 + hala bu sorunla karşılaşıyorsanız, Webkit'i ViewController'ınıza aktarmanız yeterlidir:

#import <WebKit/WebKit.h>
  1. Düzeltmeden önce: görüntü açıklamasını buraya girin

  2. Düzeltmeden sonra:

görüntü açıklamasını buraya girin


4

Bu artık görünüşte Xcode 9b4'te düzeltildi. Sürüm notlarında "WKWebView iOS nesne kitaplığında mevcut" diyor.

IOS 11 gerektirip gerektirmediğini veya henüz geriye dönük uyumlu olup olmadığını görmek için daha derinlemesine bakmadım.


Bunun çalıştığını doğrulayabilirim! Yaşasın! Ayrıca macOS hikaye tahtalarında da çalışır (en azından macOS 10.13+ hedefleyen uygulamalar için).
Clifton Labrum

1

Xcode 9'dan beri IB'de bir WKWebView başlatabilir ve yapılandırabilirsiniz, bunu kodda yapmaya gerek yoktur. görüntü açıklamasını buraya girin

Dağıtım hedefinizin iOS 10'dan daha yüksek olması gerektiğini, yoksa bir derleme zamanı hatası alacağınızı unutmayın.

görüntü açıklamasını buraya girin


0

XCode Sürüm 9.0.1'de, WKWebView, Arayüz Oluşturucu'da mevcuttur.



0

Bunun yardımcı olup olmadığından emin değilim, ancak hedef için WebKit çerçevesini ekleyerek sorunu benim için çözdüm. Gömme, sadece referansı bağlayın. IB'deki WebView nesnesini hala kullanıyorum ve ViewController'a bırakıyorum, onu gömüyorum ve hiç sorun yaşamadım ...

Şu anda 4 WKWebView MacOS projesi üzerinde çalıştım ve WebView her projede düzgün çalıştı.


-14

Bu benim için Xcode 7.2'de çalıştı ...

Öncelikle web görünümünü film şeridi / IB'ye UIWebView çıkışı olarak ekleyin. Bu size şöyle bir mülk verecektir:

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

Ardından, bir WKWebView olarak değiştirmek için kodunuzu düzenleyin.

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

Ayrıca, Kimlik denetçisinde özel sınıfı WKWebView olarak değiştirmelisiniz.


Bunu bir OS X projesiyle denedim - bu işe yaramıyor, bu yüzden iOS için özel bir durum olmalı.
henrikstroem

2
Yaptığınız şey tıpkı type-cast gibi. WebView türünü hiç DEĞİŞTİREMEZ.
DawnSong
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.