Weiß jemand, wie man diesen Fehler mit Xcode 9 GM behebt? Ich arbeite an einer App, die mit Xcode 8.3 erstellt wurde. Das Bereitstellungsziel ist iOS 9.3, und ich hatte dieses Problem noch nie zuvor. Ich finde hier oder in Apple-Foren noch keine Informationen :(
Bearbeiten: Dieser Fehler trat auf, wenn ich ein WKWebView in den Interface Builder einfügte, nicht wenn ich es programmgesteuert verwende.
Edit 2: Nun, es ist endlich kein Fehler. Weitere Informationen zu diesem Verhalten finden Sie in Quinns Antwort unten. Danke an ihn für die Erklärung.
Antworten:
Der Fehler ist korrektes Verhalten und kein Fehler in Xcode 9. Obwohl WKWebView in iOS 8 eingeführt wurde, gab es einen Fehler
-[WKWebView initWithCoder:]
, der nur in iOS 11 behoben wurde, der immer zur Laufzeit abstürzte und somit die Konfiguration eines solchen in Interface Builder verhinderte.https://bugs.webkit.org/show_bug.cgi?id=137160
Anstatt Entwicklern zu erlauben, etwas in IB zu erstellen, das zur Laufzeit fehlerhaft wäre, handelt es sich um einen Erstellungsfehler. Dies ist eine unpraktische Einschränkung, da iOS 11 erst kürzlich veröffentlicht wurde, aber es gibt wirklich keine andere gute Option.
Die Problemumgehung für ältere Bereitstellungsziele besteht darin, das WKWebView weiterhin im Code hinzuzufügen, wie @ fahad-ashraf bereits in seiner Antwort beschrieben hat:
https://developer.apple.com/documentation/webkit/wkwebview
quelle
Dies scheint ein Fehler in Xcode 9 zu sein und war auch in den Betas vorhanden. Der Build-Fehler wird nur angezeigt, wenn Sie eine WKWebView über das Storyboard erstellen. Wenn Sie die WKWebView progmatisch in der entsprechenden ViewController-Klassendatei erstellen, sollten Sie in der Lage sein, auf iOS-Versionen unter iOS 11 aufzubauen. Hier ist der auf der Apple-Website angegebene Ansatz, um dies zu erreichen:
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) }}
Sie sollten dann in der Lage sein, die WKWebView-Funktionalität wie gewohnt zu implementieren.
Quelle: https://developer.apple.com/documentation/webkit/wkwebview
quelle
super.loadView()
super.loadView()
muss am Anfang sein. Ohne es zeigt sich nichts.webview
unter meiner Navigationsleiste festlegen kann ? Diese Lösung von Ihnen funktioniert, deckt aber den gesamten Bildschirm ab.Wenn Sie zusätzlich eine benutzerdefinierte Funktion
UIViewController
mit anderen Komponenten realisieren möchten, können Sie über das Storyboard einen "Container" erstellen, der beispielsweise Folgendes enthältwebViewContainer
: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: self.webViewContainer.frame.size.width, 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) }
quelle
[LayoutConstraints] Unable to simultaneously satisfy constraints
, vergessen Sie die Zeile nichtwebView.translatesAutoresizingMaskIntoConstraints = false
. Wenn Sie den Wert auf true setzen, werdenwebView
automatisch eine Reihe von Einschränkungen für Sie erstellt , die mit den programmgesteuert hinzugefügten Einschränkungen in Konflikt stehen. Apple Docs .let customFrame = CGRect.init(origin: CGPoint.zero, size: CGSize.init(width: 0.0, height: self.webViewContainer.frame.size.height))
Bis:let customFrame = CGRect.init(origin: CGPoint.zero, size: CGSize.init(width: self.webViewContainer.frame.size.width, height: self.webViewContainer.frame.size.height))
Wenn Sie von einem älteren Ziel auf iOS 11.0 verschoben wurden und dennoch dieser Fehler angezeigt wird, verwenden Sie die folgende Lösung.
quelle
Ich habe das gleiche Problem, aber es kann angegangen werden, wenn wir WKWebView programmgesteuert hinzufügen .
Führen Sie das gewünschte Design im Storyboard aus, verlassen Sie jedoch den Raum für WKWebView. Ziehen Sie in diesem Bereich eine Ansicht per Drag & Drop, benennen Sie sie als webViewContainer und deklarieren Sie diese beiden Eigenschaften.
@property (weak, nonatomic) IBOutlet UIView *webViewContainer; @property(nonatomic, strong)WKWebView *webView;
Erstellen und fügen Sie nun WebView wie folgt hinzu:
-(instancetype)initWithCoder:(NSCoder *)aDecoder { self.webView = [self createWebView]; self = [super initWithCoder:aDecoder]; return self; }
Die Funktion createWebView wird wie folgt deklariert:
-(WKWebView *)createWebView { WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init]; return [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration]; }
Fügen Sie nun diese neu erstellte WebView wie folgt zu Ihrer containerView hinzu:
-(void)addWebView:(UIView *)view { [view addSubview:self.webView]; [self.webView setTranslatesAutoresizingMaskIntoConstraints:false]; self.webView.frame = view.frame; }
Zum Schluss laden Sie einfach Ihre URL so,
-(void)webViewLoadUrl:(NSString *)stringUrl { NSURL *url = [NSURL URLWithString:stringUrl]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; [self.webView loadRequest:request]; }
Danke, dass Sie dies gelesen haben.
quelle
WebKit wurde in iOS 8 eingeführt, aber mit einem Fehler veröffentlicht, der zu einem Laufzeitabsturz führte. Wenn Sie Xcode 9/10 verwenden , unterstützt Ihre Projektkonfiguration weniger als iOS 11 und wenn Sie versuchen, WKWebView mithilfe des Interface Builder hinzuzufügen. Xcode zeigt sofort einen Fehler bei der Kompilierung an.
WKWebView vor iOS 11.0 (NSCoding-Unterstützung wurde in der vorherigen Version unterbrochen)
Obwohl WKWebView in iOS 8 eingeführt wurde , gab es einen Fehler in - [WKWebView initWithCoder:], der nur in iOS 11 behoben wurde .
Die Lösung ist, dass Sie WKWebView über Code hinzufügen müssen (nur wenn Sie unter iOS 11 unterstützen). Das klingt eigentlich komisch.
Eine andere Lösung besteht darin, die Interface Builder-Dokumenterstellungen für die Option auf iOS 11 und höher zu ändern (wenn Sie von einem älteren Ziel auf iOS 11 migrieren und immer noch den gleichen Fehler erhalten).
quelle
// Für 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) } }
// Für Ziel 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
quelle
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 } } }
quelle
UIWebView ist in iOS11 veraltet und WKWebView funktioniert nur in iOS11 - dies klingt nach einem Fehler in Xcode GM.
quelle