誰もがXcode 9 GMでこのエラーを修正する方法を知っていますか?私はXcode 8.3で作られたアプリを開発しています。デプロイのターゲットはiOS 9.3です。これまでにこの問題に遭遇したことはありません。私はここまたはAppleフォーラムでまだ情報を見つけていません:(
編集:このエラーは、WKWebViewをインターフェイスビルダーに入れたときに発生しました。プログラム的に使用した場合ではありません。
編集2:まあ、それはついにバグではありません。この振る舞いについての詳細は、以下のQuinnの回答を参照してください。説明してくれてありがとう。
このエラーは正しい動作であり、Xcode 9のバグではありません。WKWebViewはiOS 8で導入されましたが、iOS 11でのみ修正された-[WKWebView initWithCoder:]
のバグがありました。
https://bugs.webkit.org/show_bug.cgi?id=137160
開発者が実行時に壊れる可能性のあるものをIBでビルドできるようにするのではなく、ビルドエラーです。 iOS 11が最近リリースされたばかりなので、これは不便な制限ですが、他に良い選択肢はありません。
@ fahad-ashrafが既に彼の答えで述べたように、古いデプロイメントターゲットのための回避策はWKWebViewをコードに追加し続けることです:
これはXcode 9のバグのようであり、ベータ版にもありました。ストーリーボードからWKWebViewを作成している場合にのみビルドエラーが発生します。対応するViewControllerクラスファイルにWKWebViewを段階的に作成すると、iOS 11より下のiOSバージョンでビルドできるはずです。これを達成する方法について、AppleのWebサイトで示されているアプローチは次のとおりです。
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
他のコンポーネントとともに カスタム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)
}
私は同じ問題に直面しましたが、 WKWebView をプログラム的に追加すればそれは取り組むことができます。
ストーリーボードで作成したいデザインは何でもしますが、 WKWebView 用のスペースを残して、その領域にビューをドラッグ&ドロップして webViewContainer という名前を付け、これら2つのプロパティを宣言します
@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;
}
最後に、ちょうどあなたのUrlをこのようにロードしてください、
-(void)webViewLoadUrl:(NSString *)stringUrl
{
NSURL *url = [NSURL URLWithString:stringUrl];
NSURLRequest *request = [NSURLRequest requestWithURL:url];
[self.webView loadRequest:request];
}
これを読んでくれてありがとう。