Ios 界面生成器中的WKWebView
XCode 6 beta版中的IB对象模板似乎仍在创建旧式对象(iOS版的UIWebView和OSX版的WebView)。希望苹果能为现代WebKit更新它们,但在此之前,在Interface Builder中创建WKWebViews的最佳方法是什么?我应该创建基本视图(UIView或NSView)并将其类型指定给WKWebView吗?我在网上找到的大多数示例都以编程方式将其添加到容器视图中;出于某种原因,这更好吗?正如一些人所指出的,从Xcode 6.4开始,WKWebView在Interface Builder上仍然不可用。但是,通过代码添加它们非常容易 我只是在我的ViewController中使用它。跳过接口生成器Ios 界面生成器中的WKWebView,ios,xcode,macos,uiwebview,wkwebview,Ios,Xcode,Macos,Uiwebview,Wkwebview,XCode 6 beta版中的IB对象模板似乎仍在创建旧式对象(iOS版的UIWebView和OSX版的WebView)。希望苹果能为现代WebKit更新它们,但在此之前,在Interface Builder中创建WKWebViews的最佳方法是什么?我应该创建基本视图(UIView或NSView)并将其类型指定给WKWebView吗?我在网上找到的大多数示例都以编程方式将其添加到容器视图中;出于某种原因,这更好吗?正如一些人所指出的,从Xcode 6.4开始,WKWebView在Interfa
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)
}
}
}
正如一些人所指出的,从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)
}
}
}
你是对的,它似乎不起作用。如果查看标题,您将看到:
- (instancetype)initWithCoder:(NSCoder *)coder NS_UNAVAILABLE;
这意味着您不能从nib实例化一个
您必须在viewDidLoad或loadView中手动完成此操作。您是对的-它似乎不起作用。如果查看标题,您将看到:
- (instancetype)initWithCoder:(NSCoder *)coder NS_UNAVAILABLE;
这意味着您不能从nib实例化一个
您必须在viewDidLoad或loadView中手动完成此操作。这在Xcode 7.2中对我很有效 首先将web视图添加为故事板/IB中的UIWebView出口。这将为您提供如下属性:
@property (weak, nonatomic) IBOutlet UIWebView *webView;
然后只需编辑代码即可将其更改为WKWebView
@property (weak, nonatomic) IBOutlet WKWebView *webView;
您还应该在Identity inspector中将自定义类更改为WKWebView。这在Xcode 7.2中对我很有效 首先将web视图添加为故事板/IB中的UIWebView出口。这将为您提供如下属性:
@property (weak, nonatomic) IBOutlet UIWebView *webView;
然后只需编辑代码即可将其更改为WKWebView
@property (weak, nonatomic) IBOutlet WKWebView *webView;
您还应该在Identity inspector中将自定义类更改为WKWebView。对于Xcode 8,现在这是可能的,但实现它的方法至少有点不成熟。但是,一个有效的解决方案就是一个有效的解决方案,对吗?让我解释一下 WKWebView的initWithCoder:不再标注为“NS\u不可用”。它现在看起来如下所示
- (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER;
从子类化WKWebView开始,并用编码器重写initWithCoder。您需要使用不同的init方法,而不是调用超级initWithCoder,例如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, 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更密切地遵循UIWebView的行为。对于Xcode 8,现在这是可能的,但实现这一点的方法至少有点粗糙。但是,一个有效的解决方案就是一个有效的解决方案,对吗?让我解释一下 WKWebView的initWithCoder:不再标注为“NS\u不可用”。它现在看起来如下所示
- (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER;
从子类化WKWebView开始,并用编码器重写initWithCoder。您需要使用不同的init方法,而不是调用超级initWithCoder,例如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, 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更密切地遵循UIWebView的行为。Info.plist 添加您的Info.plist传输安全设置
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
使用Swift 5以编程方式添加视图(完整示例)
Info.plist 添加您的Info.plist传输安全设置
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
使用Swift 5以编程方式添加视图(完整示例)
下面是一个简单的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中创建UIView,分配约束,并将其WKWebView\u IBWrapper
分配为自定义类,如下所示:
身份检查器选项卡[1]“>这里有一个简单的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中创建UIView,分配约束,并将其WKWebView\u IBWrapper
分配为自定义类,如下所示:
身份检查器选项卡[1]“>这显然已在Xcode 9b4中修复。发行说明中说“iOS对象库中提供了WKWebView。”
我还没有深入研究它是否需要iOS 11或是向后兼容 这显然已在Xcode 9b4中修复。发行说明中说“iOS对象库中提供了WKWebView。”
我还没有深入研究它是否需要iOS 11或是向后兼容 在XCode 9.0.1版中,可在Interface Builder上使用WKWebView。在XCode 9.0.1版中,可在Interface Builder上使用WKWebView。如果在最新版本的XCode(即v9.2+)中仍面临此问题,只需将Webkit导入到ViewController:
#import <WebKit/WebKit.h>
#导入
如果您在最新版本的Xcode(即v9.2+)中仍面临此问题,只需将Webkit导入到您的ViewController:
#import <WebKit/WebKit.h>
#导入
从Xcode 9开始,您可以在IB中实例化和配置WKWebView,而无需在代码中进行。 请注意,您的部署目标必须高于IOS10,否则将出现编译时错误
您可以实例化和