2009-02-25 10 views

risposta

4

UIWebView è una pallida, povera piccola ombra del completo WebView di WebKit, per cui è facile. -webView:shouldStartLoadWithRequest:navigationType: viene chiamato solo per la navigazione. Non viene chiamato per ogni richiesta come WebPolicyDelegate su mac. Con UIWebView, ecco come vorrei attaccare questo problema:

Implementare -webView:shouldStartLoadWithRequest:navigationType: e impostarlo per restituire sempre NO. Ma dovrai anche rispondere e generare un NSURLConnection. Quando lo NSURLConnection termina il recupero dei dati, lo esaminerai per eventuali tag IMG e li modificherai in qualsiasi segnaposto desideri. Quindi caricherete la stringa risultante nello UIWebView utilizzando -loadHTMLString:baseURL:.

Ovviamente l'analisi dell'HTML non è un compito banale su iPhone, e i caricatori Javascript ti daranno dei problemi, quindi questa non è una risposta perfetta, ma è la migliore che io conosca.

0

Sii il delegato per l'UIWebView, poi intercetta la chiamata:

– webView:shouldStartLoadWithRequest:navigationType: 

controllare i valori delle navigationType nella documentazione. Credo che ti verrà servito meglio restituendo NO su navigationType == UIWebViewNavigationTypeOther.

+0

webView: shouldStartLoadWithRequest: navigationType: viene chiamato dopo il download. – Harry

0

in questo modo la pagina viene caricata più velocemente? sembra che le immagini siano ancora in fase di download, ma non le stiamo semplicemente fornendo a UIWebView.

oppure dovrebbeStartLoadWithRequest caricare prima il testo HTML?

1

espandendo la risposta di Rob. Ho notato che quando loadHTMLString: baseURL: e restituiva sempre NO, quel webView: shouldStartLoadWithRequest: navigationType: continua a essere chiamato. (Suppongo che loadHTMLString invochi un altro shouldStartLoadWithRequest).

quindi quello che dovevo fare era alternano tra il ritorno SI/NO e ho usato NSScanner per analizzare il codice HTML e il cambiamento src = "http: // ..." per src = ""

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType 
{ 
    if (pageHasNoImages==YES) 
    { 
     pageHasNoImages=FALSE; 
     return YES;  
    } 
    NSString* newHtml; 
    NSString* oldHtml; 
    NSData *urlData; 
    NSURLResponse *response; 
    NSError *error; 
    urlData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 
    oldHtml=[[NSString alloc] initWithData:urlData encoding:NSUTF8StringEncoding]; 

    newHtml=[self.detail scannerReplaceImg:oldHtml]; // my own function to parse HTML 
    newHtml=[self.detail scannerReplaceAds:newHtml]; // my own function to parse HTML 
    if (newHtml==nil) 
    { 
     NSLog(@"newHtml is nil"); 
     newHtml=oldHtml; 
    } 
    [oldHtml release]; 

    pageHasNoImages=TRUE; 
    [web loadHTMLString:newHtml baseURL:request.URL]; 

    return NO; 
} 
Problemi correlati