Caricare dati da XML in un UIWebView al click

di il
5 risposte

Caricare dati da XML in un UIWebView al click

Ciao , sto facendo la mia prima app è fatta di 2 view Nella prima ci sono alcuni pulsanti che spostano sulla seconda view

quando clicco sul pulsante nella prima view trasmetto una richiesta asincrona per recuperare i dati da un xml e in particolare il contenuto all'interno dei nodi XML

questo funziona infatti quando clicco sul pulsante posso vedere in consolle la stringa contenuta nel nodo XML per cui faccio la richiesta

vorrei pero mostrare questa stringa in un UIWebView nella seconda vista - la UIWebView dove c'è il codice della UIWebView

Il problema che non riesco a risolvere è nell'architettura della app

infatti il primo view controller chiama al click del pulsante un metodo fechtrecords che si trova in una classe denominata XMLparser
questo metodo a sua volta chiama un altro metodo parser per leggere il primo nodo e setta il delegato che aziona in un'altra classe il parser del secondo nodo questa classe si chiama canaleRSS qui posso fare NSLog per recuperare la stringa di cui ho bisogno da mostrare nella UIWebView nella seconda vista

Il problema che la stringa la vedo in consolle con NSLog ma non riesco a questo punto a spostarmi sulla seconda view con la UIWEBVIEW che dovrebbe caricare la stringa dall'xml
-la UIWebView funziona con una stringa statica
questo è il codice nella classe parser che chiamo dalla prima vista al fetchrrecord del pulsante
   

    -( void)printHTML:(NSString*)h
    {
    [self createWebViewWithHTML:h :nil];
    }
     
     
    - (void) createWebViewWithHTML:(NSString*) htmlString:(NSURL*) baseUrlString{
    //- (void) createWebViewWithHTML{
    NSMutableString *html = [NSMutableString stringWithString: @"<html><head><title></title></head><body style=\"background-color: transparent;color:#ffffff;\">"];
    //continue building the string
    [html appendString:@"body content here"];
    [html appendString:@"</body></html>"];
    //instantiate the web view
    UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectMake(0,40,self.view.bounds.size.width,self.view.bounds.size.height-40)];
    //make the background transparent
    [webView setBackgroundColor:[UIColor clearColor]];
    //pass the string to the webview
    //[webView loadHTMLString:[htmlString description] baseURL:baseUrlString];
    [webView loadHTMLString:[html description] baseURL:baseUrlString];
    [webView setOpaque:NO];
    [webView setBackgroundColor:[UIColor clearColor]];
    //add it to the subview
    [self.view addSubview:webView];
    NSLog(@"UIWebView");
    }
  
qui recupero la stringa che mi serve dall'xml e lo passo alla seconda view

[myzrkViewController printHTML:stringaCorrente];

che con questo codice la carica del UIWEBview della seconda view
il problema è che questo arrivo al metodo che riempie lo UIWebView mi fa in consolle NSLOG ma non mi fa vedere la view con lo UIWEBview in cui mi trovo

questo è il codice come faccio a spostarmi a questo punto sul secondo controllerview dove ci sta la UIWEBview e a riempirlo della stringa?
perche se provo a fare cosi

zrkViewController1IPHONE *myzrkViewController = [[zrkViewController1IPHONE alloc] init];
[self.navigationController pushViewController:myzrkViewController animated:YES];
o cosi non va

zrkViewController1IPHONE *myzrkViewController = [[zrkViewController1IPHONE alloc] init];
[self presentViewController:myzrkViewController animated:YES completion:nil];

grazie dell'aiuto

5 Risposte

  • Re: Caricare dati da XML in un UIWebView al click

    Ciao.
    Sinceramente, pur rileggendo, ho fatto molta confusione tra i metodi e i controller che usi. Provo a farti due domande e proporti una soluzione generica.

    1) Il file RSS da parsare lo hai in locale o fai una connessione?
    2) Nel caso di risposta affermativa alla prima domanda, ti accerti che la WebView provi a caricare il contenuto DOPO che la connessione sia andata a buon fine?

    Io farei in questo modo:
    Nel primo controller faccio una semplice push al controller con la webview. Nel controller con la webView faccio partire la connessione al file RSS e il successivo parsing in un blocco in background, e nel suo completion (dove sono sicuro che ha finito quel che doveva fare), se ottengo dei dati soddisfacenti vado a caricare la webview col contenuto. Se l'rss da parsare dipende da eventi del primo controller, puoi pensare o di comunicarlo al secondo controller con un costruttore che definisci tu, oppure fare la richiesta nel primo controller, parsarlo e poi, se va tutto a buon fine, istanzi il secondo controller (sempre con un costruttore tuo, dove gli passi i dati parsati) e lo pushi.

    Me ne sono andato per un idea, quindi non escludo l' ipotesi di aver capito male il tuo problema.

    Fammi sapere
  • Re: Caricare dati da XML in un UIWebView al click

    Grazie mille per la risposta provo a fare come mi hai consigliato tu e poi posto se ho risolto o no
    ciao
  • Re: Caricare dati da XML in un UIWebView al click

    Provo a piccoli passi se mi sposto sulla seconda view, non faccio il parser e carico una stringa nella uiwebview nell'init funziona
    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) {
        
            [self createWebViewWithHTML:@"prova popolamento uiwebview" :nil];
        }
        return self;
    }
    se invece faccio il parsing
    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) {
            // Custom initialization
            zrkXMLPARSER *myzrkXMLPARSER = [[zrkXMLPARSER alloc] init];
            [myzrkXMLPARSER fetchRecords];
            
           // [self createWebViewWithHTML:@"prova popolamento uiwebview" :nil];
        }
        return self;
    }
    e provo semplicemente a popolare l'uiwebview con una stringa qualsiasi nel connectionDidFinishLoading del parser
    non popola niente
    -(void) connectionDidFinishLoading:(NSURLConnection *)conn{
        
        NSString *controlloXML = [[NSString alloc]initWithData:xml encoding:NSUTF8StringEncoding];
       
        NSXMLParser *parser = [[NSXMLParser alloc] initWithData:xml];
        [parser setDelegate:self];
        [parser parse];
        xml = nil;
        connessione = nil;
    
        zrkViewController1IPHONE *myzrkViewController = [[zrkViewController1IPHONE alloc] init];
        [myzrkViewController createWebViewWithHTML:@"prova popolamento uiwebview" :nil];
    }
    in pratica dove devo inserirlo nel parserper aggiornare lo uiwebview
    questo e il parser
    
    #import "zrkXMLPARSER.h"
    #import "zrkCanaleRSS.h"
    #import "zrkViewController1IPHONE.h"
    
    @interface zrkXMLPARSER ()
    
    @end
    
    @implementation zrkXMLPARSER
    
    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) {
            // Custom initialization
           
        }
        return self;
    }
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    	// Do any additional setup after loading the view.
    }
    
    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    -(void) connection:(NSURLConnection *)connection didReceiveData:(NSData *)data{
        
        [xml appendData:data];
        
        
    }
    -(void) connectionDidFinishLoading:(NSURLConnection *)conn{
        
        NSString *controlloXML = [[NSString alloc]initWithData:xml encoding:NSUTF8StringEncoding];
        //NSLog(@"controlloXML = %@", controlloXML);
       
        NSXMLParser *parser = [[NSXMLParser alloc] initWithData:xml];
        [parser setDelegate:self];
        [parser parse];
        xml = nil;
        connessione = nil;
        
        
        zrkViewController1IPHONE *myzrkViewController = [[zrkViewController1IPHONE alloc] init];
        [myzrkViewController createWebViewWithHTML:@"prova popolamento uiwebview" :nil];
    }
    
    
    -(void) connection:(NSURLConnection *)conn didFailWithError:(NSError *)error{
        
        connessione = nil;
        xml = nil;
        NSString *stringaErrore = [NSString stringWithFormat:@"fetch fallito: %@", [error localizedDescription]];
        UIAlertView *aw =[[UIAlertView alloc] initWithTitle:@"errore" message:stringaErrore delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [aw show];
        
    }
    -(void)fetchRecords{
        
        xml = [[NSMutableData alloc] init];
        NSURL *url = [NSURL URLWithString:@"http://www.miosito.it/index.php?r=article&id=1"];
        
        
        NSURLRequest *req = [NSURLRequest requestWithURL:url];
        connessione = [[NSURLConnection alloc] initWithRequest:req delegate:self startImmediately:YES];
        
        
    }
    
    -(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
        NSLog(@" %@ ", elementName);
        if([elementName isEqual:@"article"]){
            canale = [[zrkCanaleRSS alloc] init];
            [canale setDelegatoParserPadre:self];
            [parser setDelegate:canale];
            
            
            
        }
        
        
    }
    
    @end
    
    poi c'e il parser dei nodi interni in canaleRSS che è questo
    #import "zrkCanaleRSS.h"
    #import "zrkViewController1IPHONE.h"
    #import "zrkViewController1IPAD.h"
    
    @implementation zrkCanaleRSS
    
    @synthesize oggetti, titolo, stringaInformazioni, delegatoParserPadre;
    
    
    -(id)init {
        
        self = [super init];
        if(self){
           
            
        }
        return self;
    }
    
    -(void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict{
        
        
        NSLog(@"t%@ trovato un elemento di tipo %@ ", self, elementName);
        if([elementName isEqual:@"title"]){
            stringaCorrente = [[NSMutableString alloc]init];
            [self setTitolo:stringaCorrente];
            
            
        }
        else if([elementName isEqual:@"text"]){
            stringaCorrente = [[NSMutableString alloc]init];
            [self setStringaInformazioni:stringaCorrente];
            
            
            if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) {
                // For iPhone
       ////////////////////////         
    //////////qua c'è la stringa che devo caricare nel UIWebView
    ///////////////////stringaCorrente
            } else {
                // For iPad
               
                
                
    
            }
    
            
            
        }
      
        
    }
    
    
    -(void) parser:(NSXMLParser *)parser foundCharacters:(NSString *)string{
        
        [stringaCorrente appendString:string];
        
        
    }
    
    -(void) parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName{
        
        stringaCorrente = nil;
        if([elementName isEqual:@"article"]){
            
            [parser setDelegate:delegatoParserPadre];
            
        }
        
    }
    
    
    
    @end
    
    mi aiuti a capire dove devo intervenirte nel codice grazie dell'aiuto
  • Re: Caricare dati da XML in un UIWebView al click

    Ci sono quasi, ci sto riuscendo con l'aiuto del notification center
    l'unico problema rimasto è che la stringa che deve stamparmi L'UIWebView è una stringa html
    e precisamente questa
    Programma Settimanale
     <p> </p>
    <p><img src="images/stories/downloader.jpg" border="0" /></p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p> </p>
    <p><span style="color: #ff0000;"><br /></span></p>
    invece nell'UIWebView non mi legge l'html ma mi fa visualizzare questo con NSLog(@"extraInformation = %@", test);
    extraInformation = {
        TestNotification = "<p>\U00a0</p>
    \n<p><img src=\"images/stories/downloader.jpg\" border=\"0\" /></p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>\n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p>\U00a0</p>
    \n<p><span style=\"color: #ff0000;\"><br /></span></p>";
    }
    
    il problema deve essere qua perche gli passo la stringa tra le extrainformation del notification center che è un dictionary e forse non lo sto convertendo bene
    - (void) receiveTestNotification:(NSNotification *) notification
    {
        if ([[notification name] isEqualToString:@"TestNotification"]){
            NSDictionary *extraInformation =[notification userInfo];
            NSString *test = extraInformation;
            zrkViewController1IPHONE *myzrkViewController = [[zrkViewController1IPHONE alloc] init];
            [myzrkViewController createWebViewWithHTML:test :nil];
            [self presentViewController:myzrkViewController animated:YES completion:nil];
            NSLog (@"Successfully received the test notification!");
            NSLog(@"extraInformation = %@", test);
        }
    }
    
    come dovrei convertire l'NSDictionary in una stringa o correggere? grazie dell'aiuto
  • Re: Caricare dati da XML in un UIWebView al click

    Funziona!!! ho corretto semplicemente cosi
    - (void) receiveTestNotification:(NSNotification *) notification
    {
        if ([[notification name] isEqualToString:@"TestNotification"]){
            NSDictionary *extraInformation =[notification userInfo];
            NSString *WHTMLstringa = [extraInformation objectForKey:@"TestNotification"];
            WHTMLstringa = [WHTMLstringa stringByReplacingOccurrencesOfString:@"<img src=\""
                                                 withString:@"<img src=\"http://www.miosito.it/"];
            zrkViewController1IPHONE *myzrkViewController = [[zrkViewController1IPHONE alloc] init];
            [myzrkViewController createWebViewWithHTML:WHTMLstringa  :nil];
            [self presentViewController:myzrkViewController animated:YES completion:nil];
            NSLog (@"Successfully received the test notification!");
            NSLog(@"extraInformation = %@", WHTMLstringa );
        }
    }
    grazie, ciao!!!
Devi accedere o registrarti per scrivere nel forum
5 risposte