Поддержка 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
Если вы хотите реализовать 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 программно.
сделайте любой дизайн, который вы хотите сделать в раскадровке, но оставьте комнату для 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]; }
теперь добавьте это недавно созданное веб-представление в свой 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.раскадровка), нажмите на любую сцену.
- выберите "File Inspector", который является правым окном свойств Xcode
- изменить 'строит для 'value to'iOS 11.0 и более поздние версии'
- компиляция и сборка