Отключить ссылки в UIWebView?

я загружаю некоторый контент из интернета в UIWebView, но я бы хотел, чтобы все ссылки были отключены в UIWebView. Возможно ли это? Я мог бы разобрать текст, но я ищу что-то попроще.

7 ответов


вы можете дать UIWebView a делегат и реализовать -webView:shouldStartLoadWithRequest:navigationType: метод делегата return NO; (за исключением начальной загрузки).

что избавит пользователя от просмотра, но все одной странице.

в качестве примера предложено в комментариях... Начать с allowLoad=YES и затем:

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {
    return allowLoad;
}

- (void)webViewDidFinishLoad:(UIWebView*)webView {
    allowLoad = NO;
}

протестировано в Swift 4.0: этот подход не предполагает наличия дополнительной переменной для проверки, является ли это начальной нагрузкой или нет. Просто проверьте тип запроса (в этом случае LinkClicked) и верните false в этом случае. В противном случае просто возвращает true!

(конечно, убедитесь, что вы выберите webView.delegate)

func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
    if navigationType == .linkClicked {
        return false
    }
    return true
}

вы можете отключить обнаружение данных из вашего webview.

[webView setDataDetectorTypes:UIDataDetectorTypeNone];

для swift 3:

Попробуйте удалить видах, которые вы не хотите показывать как ссылку webView.dataDetectorTypes

webView.dataDetectorTypes.remove(UIDataDetectorTypes.all)

простой ответ, который работает в Swift 2.0:

yourWebView.dataDetectorTypes = UIDataDetectorTypes.None

просто реализуйте его в контроллере представления, где вы определяете и используете свой веб-вид, и он будет работать безупречно.


У меня была аналогичная потребность, и для некоторых случаев просто использовать webViewDidFinishLoad было недостаточно, поэтому я использовал webViewDidStartLoad для покрытия всех случаев:

func webViewDidStartLoad(webView: UIWebView) {
    startedLoading = true
}

func webViewDidFinishLoad(webView: UIWebView) {
    alreadyOpen = true
}

func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
    if startedLoading && alreadyOpen {
        // do something
        return false
    }else if startedLoading && !alreadyOpen{
        return false
    }else if !startedLoading {
        return true
    }
    return true
}

в некоторых случаях, когда html был загружен, но некоторые ресурсы, такие как изображения и некоторые тяжелые активы внутри DOM, не были запущены методом didFinishLoad, и пользователь мог перемещаться в этом "коротком" интервале.


еще один ответ для Swift 3.0:
Просто дайте ноль, чтобы не обнаружить ссылку типа исходного кода yourWebView

yourWebView.dataDetectorTypes =  UIDataDetectorTypes(rawValue: 0)