有谁知道如何使用Xcode 9 GM修复此错误?我正在开发使用Xcode 8.3制作的应用程序,部署目标是iOS 9.3,并且以前从未遇到过此问题。我在这里或在苹果论坛上找不到任何信息:(
编辑:当我将WKWebView放入界面生成器时出现此错误,而不是如果我以编程方式使用它。
编辑2:好吧,这最终不是错误,请参见下面奎因的答案以获取有关此行为的更多信息。感谢他的解释。
有谁知道如何使用Xcode 9 GM修复此错误?我正在开发使用Xcode 8.3制作的应用程序,部署目标是iOS 9.3,并且以前从未遇到过此问题。我在这里或在苹果论坛上找不到任何信息:(
编辑:当我将WKWebView放入界面生成器时出现此错误,而不是如果我以编程方式使用它。
编辑2:好吧,这最终不是错误,请参见下面奎因的答案以获取有关此行为的更多信息。感谢他的解释。
Answers:
该错误是正确的行为,不是Xcode 9中的错误。尽管WKWebView是在iOS 8中引入的,但其中的一个错误-[WKWebView initWithCoder:]
仅在iOS 11中得到修复,该错误始终在运行时崩溃,因此无法在Interface Builder中进行配置。
https://bugs.webkit.org/show_bug.cgi?id=137160
不是允许开发人员在IB中构建会在运行时损坏的内容,而是构建错误。自从iOS 11才刚刚发布以来,这是一个不便的限制,但实际上没有其他好的选择。
较早的部署目标的解决方法是继续在代码中添加WKWebView,如@ fahad-ashraf在其答案中已经描述的:
这似乎是Xcode 9中的错误,并且也存在于beta中。仅当通过情节提要板创建WKWebView时,才会出现构建错误。如果您在相应的ViewController类文件中以编程方式创建WKWebView,则应该能够在iOS 11以下的iOS版本上进行构建。这是Apple网站上给出的实现此方法的方法:
import UIKit
import WebKit
class ViewController: UIViewController, WKUIDelegate {
var webView: WKWebView!
override func loadView() {
super.loadView()
let webConfiguration = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webConfiguration)
webView.uiDelegate = self
view = webView
}
override func viewDidLoad() {
super.viewDidLoad()
let myURL = URL(string: "https://www.apple.com")
let myRequest = URLRequest(url: myURL!)
webView.load(myRequest)
}}
然后,您应该能够像往常一样实现WKWebView功能。
资料来源:https : //developer.apple.com/documentation/webkit/wkwebview
super.loadView()
super.loadView()
必须在开始时。没有它,什么也没显示。
webview
我的NavigationBar下方吗?您可以使用此解决方案,但它可以覆盖整个屏幕。
如果您还想通过其他组件实现自定义UIViewController
,则可以通过故事板创建一个“容器”,例如webViewContainer
:
import UIKit
import WebKit
class ViewController: UIViewController, WKUIDelegate {
@IBOutlet weak var webViewContainer: UIView!
var webView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
let webConfiguration = WKWebViewConfiguration()
let customFrame = CGRect.init(origin: CGPoint.zero, size: CGSize.init(width: 0.0, height: self.webViewContainer.frame.size.height))
self.webView = WKWebView (frame: customFrame , configuration: webConfiguration)
webView.translatesAutoresizingMaskIntoConstraints = false
self.webViewContainer.addSubview(webView)
webView.topAnchor.constraint(equalTo: webViewContainer.topAnchor).isActive = true
webView.rightAnchor.constraint(equalTo: webViewContainer.rightAnchor).isActive = true
webView.leftAnchor.constraint(equalTo: webViewContainer.leftAnchor).isActive = true
webView.bottomAnchor.constraint(equalTo: webViewContainer.bottomAnchor).isActive = true
webView.heightAnchor.constraint(equalTo: webViewContainer.heightAnchor).isActive = true
webView.uiDelegate = self
let myURL = URL(string: "https://www.apple.com")
let myRequest = URLRequest(url: myURL!)
webView.load(myRequest)
}
[LayoutConstraints] Unable to simultaneously satisfy constraints
,请不要忘记这一行webView.translatesAutoresizingMaskIntoConstraints = false
。如果将其设置为true,它将webView
自动为您创建一整套约束,这将与以编程方式添加的约束冲突。 苹果Docs。
如果您从较早的目标移至iOS 11.0,但仍收到此错误,请使用以下解决方案。
- 转到情节提要(Main.storyboard),单击任何场景。
- 选择“文件检查器”,它是Xcode的右侧属性窗口
- 将“ Builds for ”的值更改为“ iOS 11.0及更高版本 ”
- 编译与构建
我也遇到过同样的问题,但是如果我们以编程方式添加WKWebView可以解决。
做任何您想在情节提要中进行的设计,但留出WKWebView的空间,在该区域中拖放一个视图并将其命名为webViewContainer并声明这两个属性,
@property (weak, nonatomic) IBOutlet UIView *webViewContainer;
@property(nonatomic, strong)WKWebView *webView;
现在像这样创建并添加webView:
-(instancetype)initWithCoder:(NSCoder *)aDecoder
{
self.webView = [self createWebView];
self = [super initWithCoder:aDecoder];
return self;
}
createWebView函数声明为,
-(WKWebView *)createWebView
{
WKWebViewConfiguration *configuration =
[[WKWebViewConfiguration alloc] init];
return [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration];
}
现在,将此新创建的webView添加到您的containerView中,如下所示:
-(void)addWebView:(UIView *)view
{
[view addSubview:self.webView];
[self.webView setTranslatesAutoresizingMaskIntoConstraints:false];
self.webView.frame = view.frame;
}
最后,像这样加载您的网址,
-(void)webViewLoadUrl:(NSString *)stringUrl
{
NSURL *url = [NSURL URLWithString:stringUrl];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[self.webView loadRequest:request];
}
感谢您阅读本文。
WebKit是iOS 8中引入的,但发布时出现错误,导致运行时崩溃。如果您使用的是Xcode 9/10,则您的项目配置支持的版本少于iOS 11,并且如果您尝试使用界面构建器添加WKWebView。Xcode立即显示编译时错误。
iOS 11.0之前的WKWebView(NSCoding支持在先前版本中已被打破)
尽管WKWebView在iOS 8中引入,但– [WKWebView initWithCoder:]中存在一个错误,该错误仅在iOS 11中得到了解决。
解决方法是您必须通过代码添加WKWebView(仅当您在iOS 11以下支持时)。这听起来确实很奇怪。
另一个解决方案是将用于该选项的Interface Builder文档版本更改为iOS 11及更高版本(如果您是从较早的目标迁移到iOS 11并仍然遇到相同的错误)。
//对于Swift
import WebKit
class ViewController: UIViewController {
var webView: WKWebView!
// MARK:- WebView Configure
override func loadView() {
let webConfig = WKWebViewConfiguration()
webView = WKWebView(frame: .zero, configuration: webConfig)
view = webView
}
override func viewDidLoad() {
super.viewDidLoad()
// call urlrequest fun
loadURLRequest()
}
//MARK:- Webview URLRequest
func loadURLRequest() {
let urlString = "https://www.google.com"
let url = URL(string: urlString)
let urlRequest = URLRequest(url: url!)
webView.load(urlRequest)
}
}
//对于目标C
#import <WebKit/WebKit.h>
@interface ViewController ()<WKNavigationDelegate,WKUIDelegate>{
WKWebView *webView;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSURL *url = [[NSURL alloc] initWithString: @"https://www.google.com"];
NSURLRequest *request = [[NSURLRequest alloc] initWithURL: url];
[webView loadRequest: request];
}
- (void)loadView {
[super loadView];
WKWebViewConfiguration *configu = [[WKWebViewConfiguration alloc] init];
webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:configu];
webView.UIDelegate = self;
self.view = webView;
}
@end
import UIKit
import WebKit
class ViewController: UIViewController, WKUIDelegate {
@IBOutlet weak var webViewContainer: UIView!
private var webView: WKWebView?
override func viewDidLoad() {
super.viewDidLoad()
addWebView()
let myURL = URL(string: "https://www.apple.com")
if let myURL = myURL {
let myRequest = URLRequest(url: myURL)
webView?.load(myRequest)
}
}
private func addWebView() {
let webConfiguration = WKWebViewConfiguration()
let size = CGSize.init(width: 0.0, height: self.webViewContainer.frame.size.height)
let customFrame = CGRect.init(origin: CGPoint.zero, size: size)
self.webView = WKWebView (frame: customFrame, configuration: webConfiguration)
if let webView = self.webView {
webView.translatesAutoresizingMaskIntoConstraints = false
self.webViewContainer.addSubview(webView)
webView.topAnchor.constraint(equalTo: webViewContainer.topAnchor).isActive = true
webView.rightAnchor.constraint(equalTo: webViewContainer.rightAnchor).isActive = true
webView.leftAnchor.constraint(equalTo: webViewContainer.leftAnchor).isActive = true
webView.bottomAnchor.constraint(equalTo: webViewContainer.bottomAnchor).isActive = true
webView.heightAnchor.constraint(equalTo: webViewContainer.heightAnchor).isActive = true
webView.uiDelegate = self
}
}
}
UIWebView在iOS11中已弃用,WKWebView仅在iOS11中有效-听起来像Xcode GM中的错误。