应用程序因 WKWebView 和 UINavigationController 而崩溃

App crashes with WKWebView and UINavigationController

我正在使用 Storyboard 构建应用程序。我也使用 UINavigationController.

其中一个视图有一个工具栏,并且有一个 barButtonItem 作为 "show" segue 直接连接到另一个视图,并且视图正确显示。

要显示的视图创建了 WKWebView 的实例。在此视图中,WKWebView 工作正常。

但是,当我点击 NavigationBar 的后退按钮时,应用程序崩溃了,即使我设置了所有异常也无法捕获异常。

在使用WKWebView的view的viewDidLoad中,

WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
configuration.allowsInlineMediaPlayback = YES;
configuration.allowsAirPlayForMediaPlayback = YES;
configuration.requiresUserActionForMediaPlayback = YES;
configuration.allowsPictureInPictureMediaPlayback = YES;

webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:configuration];
webView.translatesAutoresizingMaskIntoConstraints = NO;
webView.allowsLinkPreview = YES;
webView.allowsBackForwardNavigationGestures = YES;
[_childView addSubview:webView];

webView.navigationDelegate = self;
webView.UIDelegate = self;
// Autolayout
NSDictionary *views = NSDictionaryOfVariableBindings(webView);
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[webView(>=0)]-0-|" options:0 metrics:nil views:views]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[webView(>=0)]-0-|" options:0 metrics:nil views:views]];

// Propertiesの監視
[webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];
[webView addObserver:self forKeyPath:@"title" options:NSKeyValueObservingOptionNew context:nil];
[webView addObserver:self forKeyPath:@"loading" options:NSKeyValueObservingOptionNew context:nil];
[webView addObserver:self forKeyPath:@"canGoBack" options:NSKeyValueObservingOptionNew context:nil];
[webView addObserver:self forKeyPath:@"canGoForward" options:NSKeyValueObservingOptionNew context:nil];

我创建了 WKWebView 的实例。

如何避免点击 UINavigationController 时崩溃?

提前致谢。

WKWebView 已被释放,而键值观察者仍在其中注册,我认为您应该在 deinit 时删除观察者。如:

deinit 
{
    webview.removeObserver(self, forKeyPath: "estimatedProgress")
}