Поддержка NSCoding Xcode 9 GM-WKWebView была нарушена в предыдущих версиях
кто-нибудь знает, как исправить эту ошибку с помощью Xcode 9 GM? Я работаю над приложением, сделанным с Xcode 8.3, целью развертывания является iOS 9.3, и у меня никогда не было этой проблемы раньше. Я еще не нашел никакой информации здесь или на форумах Apple: (
Edit: эта ошибка возникла, когда я поместил WKWebView в interface builder, а не если я использую его программно.
Edit 2: Ну, это, наконец, не ошибка, см. ответ Куинна ниже, чтобы иметь больше информация об этом поведении. Спасибо ему за объяснение.
8 ответов
ошибки-это правильное поведение, а не ошибка в 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 и также присутствовало в бета-версиях. Вы получите только ошибку сборки, если вы создаете WKWebView через раскадровку. Если вы создадите wkwebview в соответствующем файле класса ViewController, вы сможете создавать версии iOS ниже iOS 11. Вот подход, приведенный на веб-сайте 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
Если вы хотите реализовать таможни 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 и объявить эти два свойства,
@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]; }
Спасибо, что прочитал это.
этот метод работает только для некоторых веб-сайтов. Я пытался http://www.google.com и он не загружается.
Если вы перемещены из старой цели в iOS 11.0 и все еще получаете эту ошибку, используйте ниже Решение.
- перейти к раскадровке (Main.раскадровка), нажмите на любую сцену.
- выберите "инспектор файлов", который является окном свойств правой стороны Xcode
- изменить 'строит для 'value to'iOS 11.0 и более поздние версии'
- скомпилировать и построить
У меня тоже есть эта проблема, но когда я устанавливаю цель разработки на 11.0, проект может работать, но ошибка все еще там.