在Interface Builder中的WKWebView

看来XCode 6 beta中的IB对象模板仍在创build旧式对象(用于iOS的UIWebView和用于OSX的WebView)。 希望苹果将更新他们的现代WebKit,但在那之前,什么是在Interface Builder中创buildWKWebViews的最佳方式? 我应该创build一个基本的视图(UIView或NSView),并将其types分配给WKWebView? 我在网上find的大多数例子都以编程方式将它添加到容器视图中; 是因为某种原因更好吗?

你是对的 – 这似乎不起作用。 如果你看看标题,你会看到:

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

这意味着你不能从一个nib实例化一个。

您必须在viewDidLoad或loadView中手动完成。

正如一些人指出的那样,从Xcode 6.4开始,WKWebView在Interface Builder上仍然不可用。 但是,通过代码添加它们非常容易。

我只是在我的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) } } } 

用Swift 3和Xcode 8添加WKWebView

使用StoryBoard

ViewController.swift

 import UIKit import WebKit // Add WKWebView in StoryBoard class ViewController: UIViewController { @IBOutlet var webView: WebView! override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) webView.loadUrl(string: "http://apple.com") } } class WebView: WKWebView { required init?(coder: NSCoder) { if let _view = UIView(coder: coder) { super.init(frame: _view.frame, configuration: WKWebViewConfiguration()) autoresizingMask = _view.autoresizingMask } else { return nil } } func loadUrl(string: String) { if let url = URL(string: string) { load(URLRequest(url: url)) } } } 

Main.storyboard

 <?xml version="1.0" encoding="UTF-8"?> <document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="11542" systemVersion="16B2555" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" colorMatched="YES" initialViewController="BYZ-38-t0r"> <device id="retina4_7" orientation="portrait"> <adaptation id="fullscreen"/> </device> <dependencies> <deployment identifier="iOS"/> <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="11524"/> <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/> </dependencies> <scenes> <!--View Controller--> <scene sceneID="tne-QT-ifu"> <objects> <viewController id="BYZ-38-t0r" customClass="ViewController" customModule="stackoverflow_24167812" customModuleProvider="target" sceneMemberID="viewController"> <layoutGuides> <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/> <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/> </layoutGuides> <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC"> <rect key="frame" x="0.0" y="0.0" width="375" height="667"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <subviews> <view contentMode="scaleToFill" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="0zg-ri-o6Y" customClass="WebView" customModule="stackoverflow_24167812" customModuleProvider="target"> <rect key="frame" x="0.0" y="20" width="375" height="647"/> <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> </view> </subviews> <color key="backgroundColor" red="1" green="1" blue="1" alpha="1" colorSpace="custom" customColorSpace="sRGB"/> </view> <connections> <outlet property="webView" destination="0zg-ri-o6Y" id="G0g-bh-eej"/> </connections> </viewController> <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/> </objects> <point key="canvasLocation" x="140" y="138.98050974512745"/> </scene> </scenes> </document> 

编程

 import UIKit import WebKit // Add WKWebView programmatically class ViewController: UIViewController { var webView: WKWebView? override func viewDidLoad() { super.viewDidLoad() // init webView webView = WKWebView(frame: view.bounds) view.addSubview(webView!) } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // load url webView?.loadUrl(string: "http://apple.com") } } extension WKWebView { func loadUrl(string: String) { if let url = URL(string: string) { load(URLRequest(url: url)) } } } 

使用Xcode 8现在可以实现,但实现它的手段至less可以说是一件有趣的事情。 但是,嘿,一个工作解决scheme是一个工作的解决scheme,对吧? 让我解释。

WKWebView的initWithCoder:不再注释为“NS_UNAVAILABLE”。 现在看起来如下所示。

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

通过inheritanceWKWebView并覆盖initWithCoder开始。 不要调用super initWithCoder,而需要使用不同的init方法,比如initWithFrame:configuration :. 下面的快速示例。

 - (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, eg // myConfiguration.dataDetectorTypes = WKDataDetectorTypeAll; self = [super initWithFrame:frame configuration:myConfiguration]; // Apply constraints from interface builder. self.translatesAutoresizingMaskIntoConstraints = NO; return self; } 

在Storyboard中,使用一个UIView并给它一个新的子类的自定义类。 剩下的事情就像往常一样(设置自动布局约束,将视图链接到控制器中的sockets等)。

最后,WKWebView根据UIWebView的不同来缩放内容。 很多人可能会想要按照简单的build议来抑制WKWebView从缩放内容呈现与UIWebView相同的放大倍数 ,使WKWebView更紧密地遵循UIWebView在这方面的行为。

这是一个简单的Swift 3版本,基于crx_au的优秀答案。

 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中创build一个UIView,分配你的约束,并将它作为一个自定义的类来分配它,就像这样:

实用程序 - >身份检查器选项卡[1]

这现在显然是在Xcode 9b4中修复的。 发行说明说“WKWebView在iOS对象库中可用”。

我没有深入了解它是否需要iOS 11或向后兼容。

在XCode版本9.0.1中,WKWebView在Interface Builder上可用。

这在Xcode 7.2中为我工作…

首先添加Web视图作为故事板/ IB中的UIWebViewsockets。 这会给你一个这样的属性:

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

然后只需编辑您的代码,将其更改为WKWebView。

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

您还应该在自定义检查器中将自定义类更改为WKWebView。