NSInvalidArgumentException',原因:'Configuration cannot be nil' 从 UIWebView 迁移到 WKWebView

NSInvalidArgumentException', reason: 'Configuration cannot be nil' while migrating from UIWebView to WKWebView

我似乎无法找出什么是 nil 。调用此 WKWebView 的控制器不为零。一定有某种我没有设置的配置类型。有什么想法吗?

HelpViewViewController.h



#import <UIKit/UIKit.h>
#import <WebKit/WebKit.h>

@interface HelpViewViewController : UIViewController
< WKUIDelegate, WKNavigationDelegate>{}



@property (nonatomic, strong) IBOutlet WKWebView *webView;
@property (weak, nonatomic) IBOutlet UIBarButtonItem *sidebarButton;

@property (assign) NSString *urlString;

@end

HelpViewViewController.m

#import "HelpViewViewController.h"
#import "SWRevealViewController.h"
#import "Functions.h"

@interface HelpViewViewController ()

@end

@implementation HelpViewViewController

@synthesize webView,urlString;

NSURL *urlToSave2 = nil;


- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@" start %@",urlString);

此 NSLog 永远不会被调用。在调用 viewDidLoad 之前它正在崩溃。


    WKWebViewConfiguration *theConfiguration = [[WKWebViewConfiguration alloc] init];
    WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:theConfiguration];
    webView.navigationDelegate = self;
    NSURL *nsurl=[NSURL URLWithString:@"http://www.apple.com"];
    NSURLRequest *nsrequest=[NSURLRequest requestWithURL:nsurl];
    [webView loadRequest:nsrequest];
    [self.view addSubview:webView];

    
    NSLog(@" end %@",urlString);
}

尽管 Apple 文档说您可以创建一个 WKWebView 作为 outlet,但我还没有看到该工作的示例。我建议将其从 xib/storyboard 中删除,使其成为常规实例变量,并使用 in-code 初始化。

(在我的例子中,这也需要在添加为子视图时添加约束。)

我无法通过添加 WKWebView IBOutlet 在模拟器上重现错误。

BUT,如果我放了一个 UIWebView 对象,我确实重现了它,并将 Storyboard 中的 class 更改为 WKWebView
如果那是您为“更新代码”所做的,请不要那样做。
相反,删除 Storyboard 中的 outlet,并添加一个新的 WKWebViewWKWebViewUIWebView 是两个不同的 class,即使它们的“目标”相同。但是它们是不同的,并且需要不同的 initialization/parameters,并且当从 Storyboard 读取它时,当加载发生时,在这种情况下它会破坏一切:

如果您打开新添加的 WKWebView 插座的 Storyboard(作为源代码,即 XML),您将拥有:

<wkWebView contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="R9K-yX-E6A">
    <rect key="frame" x="0.0" y="0.0" width="320" height="284"/>
    <color key="backgroundColor" red="0.36078431370000003" green="0.38823529410000002" blue="0.4039215686" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
    <wkWebViewConfiguration key="configuration">
        <audiovisualMediaTypes key="mediaTypesRequiringUserActionForPlayback" none="YES"/>
        <wkPreferences key="preferences"/>
    </wkWebViewConfiguration>
</wkWebView>

如果您手动将 UIWebView 的 class 更改为 WKWebView,您将拥有:

<webView contentMode="scaleToFill" translatesAutoresizingMaskIntoConstraints="NO" id="JoT-Lq-Nq2" customClass="WKWebView">
    <rect key="frame" x="40" y="341" width="240" height="128"/>
    <color key="backgroundColor" red="0.36078431370000003" green="0.38823529410000002" blue="0.4039215686" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
</webView>

你看真正的classif webView(即UIWebView),设置为自定义WKWebViewBUT,还有一个 BUT,如果你仔细检查正确的(前一个),你会看到它是一个 wkWebViewConfiguration 标签。它设置在情节提要中。添加插座时隐式添加。