Поддержка NSCoding Xcode 9 GM-WKWebView была нарушена в предыдущих версиях


кто-нибудь знает, как исправить эту ошибку с помощью Xcode 9 GM? Я работаю над приложением, созданным с помощью Xcode 8.3, цель развертывания-iOS 9.3, и у меня никогда не было этой проблемы раньше. Я еще не нашел никакой информации здесь или на форумах Apple : (

Edit: эта ошибка возникла, когда я поместил WKWebView в interface builder, а не если я использую его программно.

Edit 2: Ну, это, наконец, не ошибка, см. ответ Куинна ниже, чтобы получить дополнительную информацию об этом поведении. Спасибо ему за объяснение.

8 99

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 уже описал в своем ответе:

https://developer.apple.com/documentation/webkit/wkwebview

это, кажется, ошибка в 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

Если вы хотите реализовать custom 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 программно.

  1. сделайте любой дизайн, который вы хотите сделать в раскадровке, но оставьте комнату для WKWebView в этой области перетаскивания и назовите его как webViewContainer и объявить эти два свойства,

    @property (weak, nonatomic) IBOutlet UIView *webViewContainer;
    @property(nonatomic, strong)WKWebView *webView;
    
  2. Теперь создайте и добавьте 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];
    }
    
  3. теперь добавьте это недавно созданное веб-представление в свой containerView, например:

    -(void)addWebView:(UIView *)view
    {
          [view addSubview:self.webView];
          [self.webView setTranslatesAutoresizingMaskIntoConstraints:false];
          self.webView.frame = view.frame;
    }
    
  4. наконец, просто загрузите свой 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 и все еще получаете эту ошибку, то используйте ниже Решение.

  1. перейти к раскадровке (Main.раскадровка), нажмите на любую сцену.
  2. выберите "File Inspector", который является правым окном свойств Xcode
  3. изменить 'строит для 'value to'iOS 11.0 и более поздние версии'
  4. компиляция и сборка

enter image description here

У меня тоже есть эта проблема,но когда я устанавливаю цель разработки на 11.0,проект может запускаться, но ошибка все еще существует.

UIWebView устарел в iOS11 и WKWebView работает только в iOS11-это звучит как ошибка в Xcode GM.