为啥没有在我的 webView 中触发 observeValueForKeyPath?

Posted

技术标签:

【中文标题】为啥没有在我的 webView 中触发 observeValueForKeyPath?【英文标题】:Why doesn't observeValueForKeyPath trigger in my webView?为什么没有在我的 webView 中触发 observeValueForKeyPath? 【发布时间】:2020-02-10 12:51:47 【问题描述】:

由于webviewdidfinishload 已被弃用,并且webKit 代表在导航到另一个url 时似乎没有触发(据我所知),我研究了使用观察者forKeyPath,就像这里:

How can I detect when url of amp page changed with WKWebview

虽然这似乎是一种有效的方法,但我无法触发 observeValue。有时它有效,但大多数情况下无效,而且似乎没有任何一致性。

- (void)setUpWebView 
    NSString * urlString = [NSString stringWithFormat:@"www.thisisnottherealurl.com"];

    NSURL *url = [NSURL URLWithString: urlString];

    NSURLRequest *request = [NSURLRequest requestWithURL:url];

    WKWebViewConfiguration *webViewConfig = [WKWebViewConfiguration new];

    _webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:webViewConfig];
    _webView.navigationDelegate = self;
    _webView.translatesAutoresizingMaskIntoConstraints = NO;
    _webView.alpha = 0.0f;
//    _webView.alpha = 1;

    [_webViewContainer addSubview:_webView];

    [self startLoadingAnimation];

    [_webView.topAnchor constraintEqualToAnchor:_webViewContainer.topAnchor].active = YES;
    [_webView.bottomAnchor constraintEqualToAnchor:_webViewContainer.bottomAnchor].active = YES;
    [_webView.rightAnchor constraintEqualToAnchor:_webViewContainer.rightAnchor].active = YES;
    [_webView.leftAnchor constraintEqualToAnchor:_webViewContainer.leftAnchor].active = YES;
    [_webView.heightAnchor constraintEqualToAnchor:_webViewContainer.heightAnchor].active = YES;

    [_webView loadRequest:request];

    //IMPORTANT PART
    [_webView addObserver:self forKeyPath:@"url" options: NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld | NSKeyValueObservingOptionPrior context:nil];

然后是observeValue 部分:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary<NSKeyValueChangeKey,id> *)change context:(void *)context 
     NSLog(@"????OBSERVED");

现在,这不会触发。除了观察_webView,我还尝试了_webView.URL.absoluteString。但是,它仍然没有触发。我添加了这样的替代选项:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld | NSKeyValueObservingOptionPrior 但仍然没有。

我做错了什么?

有没有更好的方法来解决这个问题?导航到另一个 url 链接时是否有 delegate 实际触发?

【问题讨论】:

【参考方案1】:

您可以从 WKWebView 的 WKNavigationDelegate 使用此方法。

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler

 NSURLRequest* request = navigationAction.request;
 if ([request.URL.urlString hasPrefix:@<Do ur checking here>])

 decisionHandler(WKNavigationActionPolicyCancel); // Cancel the request

else 

decisionHandler(WKNavigationActionPolicyAllow); // Allow the request.


【讨论】:

谢谢,但是当我点击周围时不会触发。仅在加载 weView 时。 您能告诉我们您是如何导航到另一个网址的吗?尝试 webViewConfiguration.dataDetectorTypes = WKDataDetectorTypeAll 并导航。这应该调用委托方法。文档本身就是这么说的。 "决定是允许还是取消导航。" 嗯,它只是一个和其他网页一样的网页,因此按下不同的链接和按钮会将用户带到不同的子网址。我添加了 webViewConfiguration.dataDetectorTypes = WKDataDetectorTypeAll 但没有任何反应。委托只是在 webView 启动时触发(很多次),但随后什么也没有。

以上是关于为啥没有在我的 webView 中触发 observeValueForKeyPath?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的状态之一在我的测试期间没有被触发

为啥在我松开手指之前我的 UIButton 的选中状态没有被触发?

为啥我的事件监听器没有在 laravel 5 中触发?

为啥我的 AngularJS ajax 自动触发,即使我没有调用它?

在Webview渲染器中处理自定义事件

为啥 cellForRowAtIndexPath 没有被触发,但其他方法被触发了?