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,并添加一个新的 WKWebView
。
WKWebView
和 UIWebView
是两个不同的 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
),设置为自定义WKWebView
。 BUT,还有一个 BUT,如果你仔细检查正确的(前一个),你会看到它是一个 wkWebViewConfiguration
标签。它设置在情节提要中。添加插座时隐式添加。
我似乎无法找出什么是 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,并添加一个新的 WKWebView
。
WKWebView
和 UIWebView
是两个不同的 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
),设置为自定义WKWebView
。 BUT,还有一个 BUT,如果你仔细检查正确的(前一个),你会看到它是一个 wkWebViewConfiguration
标签。它设置在情节提要中。添加插座时隐式添加。