UIWebView, загружающий проанализированную строку HTML

я создаю приложение, которое отобразит некоторые новостные рассылки пользователям. новостные рассылки отображены в uiWebView. Я читаю URL для новостных рассылок от RSS ленты. Я анализирую xml, и в табличном представлении у меня есть все новостные рассылки. Когда ячейка нажата, uiWebView продвинут, и новостная рассылка загружается. Поскольку uiWebView не открывает ссылки, которые имеют цель = _ пробел, я должен заменить _blank от цели с "". В NSOperation я загружаю содержание HTML и после того, как загрузка закончена, я заменяю строки как это:

NSMutableString *page = [[[NSMutableString alloc] initWithData:pageData encoding:NSISOLatin1StringEncoding] autorelease]; [page replaceOccurrencesOfString:@"target=_blank" withString:@"target=""" options:0 range:NSMakeRange(0, [page length])];

после того, как я сделаю это, я загружаю проанализированную строку в webView для отображения его пользователю.

[myWebView loadHTMLString:page baseURL:[NSURL URLWithString:@""]];

в то время как NSOperation загружает содержание страницы HUD с индикатором действия и маркировкой, которая говорит, что Загрузка, показал. Когда загрузка закончена, HUD удален из суперпредставления.

пока неплохо.. но здесь приезжайте вопросы. я использовал NSOperation с функцией обратного вызова, потому что я не смог определить последнюю возможность к webDidFinishLoading (я считал этот UIWebView - Как определить "последнее" сообщение webViewDidFinishLoad? - это - часть моей проблемы, но ответ должен был использовать некоторую Apple частные классы, и это - проблема для меня). таким образом, я делаю это:

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType {


NSURL *url = request.URL;
NSString *urlString = url.absoluteString;
NSLog(@"WebViewSouldStartWithRequest: %@", urlString);
if (navigationType == UIWebViewNavigationTypeLinkClicked)
{
    if(![urlString isEqualToString:@"about:blank"])
    {
        NSLog(@"FeedViewController: startPageLoad");
        activityHud = [[HUDView alloc] initWithFrame:CGRectMake(110, 100, 80, 80)];
        [activityHud setText:@"Loading"];
        [myWebView addSubview:activityHud];
        NSLog(@"FeedViewController: pageUrl = %@", urlString);
        [self resetWebView];
        [urlLoader loadPageFromUrl:request.URL withCallbackTarget:self withCallbackSelector:@selector(endLoading:)];
    }
}

return NO;

}

- (void) endLoading:(NSMutableString *)page { [self resetWebView]; NSLog(@"FeedViewController: endLoading"); [activityHud removeFromSuperview]; [myWebView loadHTMLString:page baseURL:[NSURL URLWithString:@""]]; }

после того, как я касаюсь ячейки в табличном представлении, и новостная рассылка, показал, что похоже, что это должно, когда я нажимаю на ссылку в новостной рассылке, страница загружается новым запросом, проанализировала, но визуально не смотрит, как это должно (я посмотрел на страницу после парсинга в NSLog, и это имеет стили CSS и теги HTML, голову, тело, открытое и закрытое правильно), у кого-либо была эта проблема с uiWebView, не показывая веб-страницы правильно?

я пытался загрузить страницу - (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType{ return YES; } и в - (пустой) webViewDidFinishLoad: (UIWebView *) webview {} и в - webViewDiStartLoad

но методы называют для каждого объекта, который загружается в webview, настолько показывающем и скрывающемся HUD в тех, которые метод не является хорошим решением.

Я встретился с некоторыми проблемами при использовании - (BOOL) webView: (UIWebView*) webView shouldStartLoadWithRequest: (NSURLRequest*), запрашивают navigationType: (UIWebViewNavigationType) navigationType {... возвращаются НЕ}

например, ссылки, которые имеют пути как это/bilder-galerien для не работы и в NSLog, я получаю это для них

Неизвестная схема, ничего не делая:/bilder-galerien

но когда я использую

  • (BOOL) webView: (UIWebView*) webView shouldStartLoadWithRequest: (NSURLRequest*), запрашивают navigationType: (UIWebViewNavigationType) navigationType {возвращают Да} и didstartLoading и finishLoading, URL загружаются, и я не знаю почему...

другой проблемой являются специальные немецкие символы.. в моей первой загрузке (после нажатия ячейки в uiTableView) страница анализируется как он, должен быть uiWebView, но после того, как я нажимаю на ссылку, и соответствующий запрос загружается, также символы не анализируются правильно..

кто-либо может указать на меня в хорошем направлении?заранее спасибо

6
задан Community 23 May 2017 в 12:30
поделиться

1 ответ

UIWebView не открывает ссылки target = "_ blank". Некоторые ссылки не запускают события UIWebViewNavigationTypeLinkClicked. Это происходит, когда ссылка имеет атрибут target = "_ blank".

Чтобы обойти эту проблему, я использовал приведенный ниже код. Он вставляет некоторый javascript после загрузки страницы, чтобы удалить целевой атрибут из всех ссылок. После использования этого кода мне больше не нужно было анализировать исходный код html и, например, заменять _blank на _self.

- (void)webViewDidFinishLoad:(UIWebView *)webView {
        NSString *js = @"\
        var d = document.getElementsByTagName('a');\
        for (var i = 0; i < d.length; i++) {\
            if (d[i].getAttribute('target') == '_blank') {\
                d[i].removeAttribute('target');\
            }\
        }\
        ";

        [webView stringByEvaluatingJavaScriptFromString:js];
}
4
ответ дан 17 December 2019 в 00:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: