为啥没有在我的 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 的选中状态没有被触发?