Отключить ссылки в UIWebView? - PullRequest
19 голосов
/ 20 января 2010

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

Ответы [ 7 ]

54 голосов
/ 20 января 2010

Вы можете присвоить 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;
}
11 голосов
/ 28 июля 2016

Протестировано в 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
}
4 голосов
/ 26 июля 2014

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

[webView setDataDetectorTypes:UIDataDetectorTypeNone];
1 голос
/ 07 сентября 2017

для быстрой 3:

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

webView.dataDetectorTypes.remove(UIDataDetectorTypes.all)
0 голосов
/ 19 декабря 2017

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

yourWebView.dataDetectorTypes =  UIDataDetectorTypes(rawValue: 0)
0 голосов
/ 20 мая 2016

У меня была аналогичная потребность, и в некоторых случаях просто использования 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 не запускался, и пользователь мог перемещаться в этом «коротком» интервале.

0 голосов
/ 22 октября 2015

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

yourWebView.dataDetectorTypes = UIDataDetectorTypes.None

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...