Почему в моем webView не отображается триггер ValueForKeyPath? - PullRequest
0 голосов
/ 10 февраля 2020

Поскольку webviewdidfinishload устарело, а делегаты webKit, похоже, не срабатывают при переходе к другому url (из того, что я вижу), я изучил использование наблюдателя forKeyPath, как здесь:

Как я могу определить, когда URL-адрес страницы усилителя изменился с помощью 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, но все еще ничего.

Что я делаю не так?

Есть ли лучший подход к этому? Есть ли delegate, который фактически срабатывает при переходе по другой ссылке?

1 Ответ

0 голосов
/ 10 февраля 2020

Вы можете использовать этот метод из WKNavigationDelegate WKWebView.

- (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.
}

...