Differenti metodi per differenti webview

di il
11 risposte

Differenti metodi per differenti webview

Ciao a tutti, premetto che non sono un programmatore professionista, ma sto cercando di imparare per diletto e curiosità, quindi chiedo scusa in anticipo se non riesco ad essere chiarissimo.

sto creando una app per visualizzare le classifiche della mia lega di calcetto, che sono reperibili sotto forma di immagini sul sito di quest'ultima. quindi la app è strutturata in modo abb semplice. una home dove attraverso una table view si sceglie il girone. poi ad ogni girone è assegnata un'ulteriore table view dove è possibile scegliere il tipo di cassifica da visualizzare (es marcatori, generale, disciplinare) quindi ad ogni voce di questa table view sottostà una webview dove viene visualizzata l'immagine attraverso il suo link.

siccome queste webview sono molteplici (i gironi sono 7 e le classifiche 4 per ognuno, quindi in totale 28 webview) mi interessava sapere come impostare differenti metodi e request di modo che ognuna visualizzasse un link unico.

ho trovato dei tutorial ma spiegano tutti come gestire una singola webview in una app e non molteplici.

come posso risolvere?

Grazie mille!

11 Risposte

  • Re: Differenti metodi per differenti webview

    Dovrai avere un controller generico con una webview, e quando istanzi il controller nel didSelectRow della tua table view, gli passi (come parametro del costruttore o con un setter di una property) l' url da caricare.

    Se non riesci o non sai come fare dillo che provo a darti una mano

  • Re: Differenti metodi per differenti webview

    Wow, grazie mille per la risposta! in realtà data la mia esperienza minima con questo tipo di programmazione non ho ben chiaro il tuo suggerimento, ma sono riuscito ad ovviare in due modi. vorrei descriverteli così tu mi puoi dire se sono accettabili o se poi posso trovare difficoltà:

    1
    seguendo questo tutorial :
    ho creato nel mio file webviewcontroller.h queste due proprietà
    @property (nonatomic, strong) IBOutlet UIWebView *webview1;
    @property (nonatomic, strong) IBOutlet UIWebView *webview2;
    e nel mio file webviewcontroller.m ho richiamato i due metodi relativi
    @synthesize webview1;
    @synthesize webview2;
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    	
        NSURL *url1 = [NSURL URLWithString:@"http://www.google.com"];
        NSURLRequest *requestURL1 = [NSURLRequest requestWithURL:url1];
        [webview1 loadRequest:requestURL1];
        [super viewDidLoad];
        
        NSURL *url2 = [NSURL URLWithString:@"http://www.apple.it"];
        NSURLRequest *requestURL2 = [NSURLRequest requestWithURL:url2];
        [webview2 loadRequest:requestURL2];
        [super viewDidLoad];    
    }
    ho poi assegnato ad ogni webview una sua proprietà (spero di usare i termini giusti) e tutto funziona.


    2.
    anzichè utilizzare le webview ho utilizzato le imageview inserite in un viewcontroller
    nel file viewcontroller.h ho creato questi outlet
    {
        IBOutlet UIImageView *ClsA1Lun; //classifica
        IBOutlet UIImageView *MrcA1Lun; //marcatori
        IBOutlet UIImageView *CalA1Lun; //calendario
        IBOutlet UIImageView *DisA1Lun; //disciplinare
    }
    mentre nel file viewcontroller.m ho inserito questi metodi (spero si chiamino così)
    - (void)viewDidLoad
    {
        [super viewDidLoad];
    
        
        
        // A1 Lunedì
        
        ClsA1Lun.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.lega5.it/images/Classifica-A1-Lunedi-2013-14.png"]]];
        
        MrcA1Lun.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.lega5.it/images/Marcatori-A1-Lunedi-2013-14.png"]]];
        
        CalA1Lun.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.lega5.it/images/CALENDARIO-SERIE-A1-2013-14_8yg31id3.png"]]];
        
        DisA1Lun.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:@"http://www.lega5.it/images/Ammonizioni-A1-Calcio-a-5-Invernale-2013-14.png"]]];
    }    
    
    e poi assegnando ad ognuna immagine il suo outlet

    come vedi il secondo metodo è quello che stavo cercando di utilizzare, mentre il primo era solo una prova.
    il problema però ora è questo: sto incontrando alcuni problemi relativi alla velocità di apertura dei viewcontroller contenenti le imageview durante la simulazione.
    all'inizio avevo creato un solo file viewcontroller.h + viewcontroller.m contenente tutti gli outlet che mi servivano (una trentina circa) ma notavo davvero una lentezza notevole nell'aprire ogni singola pagina contenente una imageview.
    allora ho deciso di spezzare in due il file creando un (calcio5viewcontroller.h + calcio5viewcontroller.m) con una ventina di outlet e un (calcio8viewcontroller.h + calcio8viewcontroller.m) con una decina di outlet, il risultato è stato sicuramente migliore, ho guadagnato un po di velocità ma cmq non è ancora immediato il tutto. è un problema relativo al simulatore o queste latenze rimarranno anche nell'app se non le risolvo?

    grazie mille, mi rendo conto di essere ultra lungo, ma non vorrei creare incomprensioni e far perdere tempo a chi mi aiuta!
  • Re: Differenti metodi per differenti webview

    Allora, andiamo per gradi. Credo ( e spero ) di aver capito ora quello che vuoi fare, quindi ti dico prima come farei io. Dopo ti dirò cosa non va nelle due soluzioni che hai provato.

    1. Soluzione mia
    Creerei un controller (MyController) che si occuperà semplicemente di Mostrare un' immagine dato un URL.

    Nel "MyController.h" Dichiaro un'attributo UIImageView ed un' attributo UIImage. Inoltre dichiaro la firma di un costruttore custom che prende come parametro di input una stringa (che sarà l' url dell' immagine).
    
    @interface MyController : UIViewController
    {
        //Attributi
        UIImageView *imageView;
        UIImage *image;
    }
    
    //Costruttore custom
    - (id) initWithImageURL:(NSString*)url;
    
    @end
    
    Nel "MyController.m" implemento il costruttore che si carica l' immagine e la assegna al nostro attributo "image".
    In seguito implemento il viewDidLoad dove istanzio la UIImageView da assegnare all' attributo "imageView", gli assegno l' "image" ed aggiungo l' "imageView" alla view del nostro controller (con addSubview).
    
    #import "MyController.h"
    
    @implementation MyController
    
    - (id) initWithImageURL:(NSString*)url
    {
        self = [self init];
        if (self)
        {
            //Mi carico l' immagine da url e la assegno al mio attributo image
            image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:url]]];
        }
    
        return self;
    }
    
    - (void) viewDidLoad
    {
        //Chiamo UNA VOLTA il super, prima di scrivere il mio codice
        [super viewDidLoad];
    
        //Istanzio la mia imageView e la assegno all'attributo. 
        //Come frame gli passo self.view.bounds che corrisponde
        //alle coordinate (0,0,larghezza della view, altezza della view)
        imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
    
        //Setto l' image della "imageView"
        [imageView setImage:image];
       
        //Aggiungo l' imageView alla view mostrata dal controller
        [self.view addSubview:imageView];
    }
    
    @end
    
    Quando andrai dunque ad istanziare il tuo controller (al click di un bottone, ad esempio), farai:
    
        MyController *cnt = [[MyController alloc] initWithImageURL:@"http://www.lega5.it/images/Classifica-A1-Lunedi-2013-14.png"];
    

    Ho utilizzato una delle tue immagini di esempio, ma ovviamente a seconda del bottone gli passi un' immagine diversa. Ovviamente dopo che istanzi il controller dovrai mostrarlo o con una push o con un present.

    2. Soluzione webView
    Non capisco sinceramente perchè hai 2 webview. Te ne basta una e andrai a variare l' url da caricare all'interno a seconda delle tue esigenze.
    Nell' esempio precedente ho provato a spiegarti tutto in maniera dettagliata perchè ho notato che sei un appassionato del "Copia e Incolla". L' ho capito da questa porzione di codice che ti ricopio lasciandoti un commento:
    
    - (void)viewDidLoad
    {
        //Il super non fa altro che richiamare il viewDidLoad della classe padre, ovvero di 
        //UIViewController. Pertanto è sbagliato chiamarlo più di una volta. Tu lo hai
        //chiamato 3 volte perchè magari ne ignori l'utilità, lo hai letto su internet e lo hai
        //copiaincollato brualmente
        [super viewDidLoad];
       
        NSURL *url1 = [NSURL URLWithString:@"http://www.google.com"];
        NSURLRequest *requestURL1 = [NSURLRequest requestWithURL:url1];
        [webview1 loadRequest:requestURL1];
        [super viewDidLoad];
        
        NSURL *url2 = [NSURL URLWithString:@"http://www.apple.it"];
        NSURLRequest *requestURL2 = [NSURLRequest requestWithURL:url2];
        [webview2 loadRequest:requestURL2];
        [super viewDidLoad];    
    }
    
    Insomma l' errore che noto qua è che hai 2 webView di cui ne ignoro l'utilità e che hai utilizzato il viewDidLoad in maniera impropria.

    3. Soluzione Immagini
    Poco da dire, l' idea di istanziare in un controller un mare di immagini da URL è un qualcosa di malsano . Quando si hanno tante immagini che sono tendenzialmente sempre le stesse, si punta ad utilizzare sistemi di caching, ovvero si salvano le immagini in locale, in modo che se l'immagine è già salvata non la riscarica da url, ma la carica dal dispositivo, cosa di sicuro più rapida.
    è un problema relativo al simulatore o queste latenze rimarranno anche nell'app se non le risolvo?
    Probabilmente sarà peggio. Quando usi il simulatore stai usando l' hardware del tuo mac, che è di sicuro più potente dell' hardware dell' iphone. Inoltre col simulatore utilizzi la tua connessione di casa, mentre sull' iphone potresti usare il 3g che è quasi sicuramente più lento.


    Un consiglio che ti do è quello di abbracciarti un libro per capire le basi, prima di lanciarti sui tutorial (che comunque sono un buon approccio, dopo che però hai assimilato le cose basilari).

    Fammi sapere se ti sono stato d'aiuto o qualcosa non ti è chiara
  • Re: Differenti metodi per differenti webview

    Ok, penso di aver capito!
    con il tuo metodo il mio pulsante anzichè portarmi nel viewcontroller relativo alla data imageview (e quindi di conseguenza obbligarmi a creare un viewcontroller nello storyboard per ogni immagine), mi porta nell'unico viewcontroller da me creato che, a seconda del comando che il pulsante invia, visualizza l'immagine richiesta. correct?

    per rispondere ai tuoi dubbi:
    ho due webview perchè in realtà era una prova fatta sull' avere un solo file xxxxxx.m che mi permettesse di aprire però diverse pagineweb semplicemente richiamando un dato nome relativo all'una o all'altra (e allora ho provato con due). in realtà le immagini che devo visualizzare sono una trentina come ti dicevo, quindi trenta webview.

    mi rendo conto che ovviamente crearne una sola come suggerisci tu sia molto meglio .

    (avrei altre domandine ma penso di andare OT, posso eventualmente contattarti in privato? visto che cmq la questione del topic appare dipanata )

    grazie ancora!
  • Re: Differenti metodi per differenti webview

    Esattamente, è sempre bene cercare di sviluppare un controller generico se possibile, in modo che esso possa essere riutilizzato.

    In quanto alle altre domande, apri nuovi topic e appena posso ti rispondo, in modo che se qualcun altro cerca la tua stessa cosa trova già materiale a riguardo. Se mi scrivi in privato magari tra una settimana qualcuno è qui a chiedere la stessa cosa.

  • Re: Differenti metodi per differenti webview

    Ok!

    sempre relativamente a questa questione, se ne hai voglia e tempo (mi rendo conto che non sei certo al mio servizio) potresti darmi un esempio di codice come hai fatto sopra ma relativo a due immagini (quindi due link) di modo che possa vedere dove sono i nomi delle variabili che assegni (che nel mio caso alla fine saranno le trenta immagini, i trenta link).
    davvero se non è uno sbattimento.

    mi sembra di capire che il link lo si inserica come ID nel controller.h per iserirne molteplici devo creare molteplici id?

    grazie ancora!
  • Re: Differenti metodi per differenti webview

    Il mio consiglio è quello di crearti un array contentente tutti gli url ordinati come lo sono le voci della tua UITableView.
    Questo vuol dire che nel tuo controller con la tableView, dovrai avere un attributo di classe NSArray (un pò come ho fatto con l' UIImageView nel MyController). Supponiamo che dichiari quindi un
    NSArray *urls;
    Nel viewDidLoad del tuo controller (sempre quello della tableView, non quello che ho fatto io)
    dovresti fare una cosa del genere:
    
    urls = @[@"http://www.lega5.it/images/Classifica-A1-Lunedi-2013-14.png",
                              @"http://www.lega5.it/images/Classifica-A1-Martedi-2013-14.png",
                              @"http://www.lega5.it/images/Classifica-A1-Mercoledi-2013-14.png",
                              @"http://www.lega5.it/images/Classifica-A1-blabla-2013-14.png",
                              @"http://www.lega5.it/images/Classifica-A1-blablabla-2013-14.png",
                              @"http://www.lega5.it/images/Classifica-A1-robadelgenere-2013-14.png",
                              @"http://www.lega5.it/images/Classifica-A1-eviadicendo-2013-14.png"];
    
    e nel tuo didSelectRowAtIndexPath farai:
    
    MyController *cnt = [[MyController alloc] initWithImageURL:[urls objectAtIndex:indexPath.row]];
    self.navigationController pushViewController:cnt animated:YES];
    

    Ovviamente il metodo della tableView numberOfRowsInSection dovrà ritornare il numero di url che hai (avrai una riga per ogni url, suppongo):
    
    return [urls count];
    

    Chiaro?
  • Re: Differenti metodi per differenti webview

    Ok, penso di si. ora proverò così, grazie mille ancora!
  • Re: Differenti metodi per differenti webview

    Ok allora ho provato a fare una semplice app per provare il metodo da te suggerito ma mi sfugge solo un passaggio, ti elenco quello che ho fatto:

    -crato una singleview app formata da una tableview (view iniziale) con due voci che portano ad un view controller con dentro una Imageview.

    - nel file tableviewcontroller.h ho creato l'attributo array:
    
    @interface XYZTableViewController : UITableViewController
    {
        NSArray *urls;
    }
    -nel file tableviewcontroller.m ho creato il mio array e sistemato il numero delle linee:
    
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        urls = @[@"http://www.lega5.it/images/Classifica-A1-Lunedi-2013-14.png",
                 @"http://www.lega5.it/images/Classifica-A1-Martedi-2013-14.png"];
    
    .....
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        // Return the number of rows in the section.
        return [urls count];
    }
    }
    -nel file viewcontroller.h ho quindi creato i miei attributi:
    @interface XYZViewController : UIViewController
    {
        UIImageView *imageView;
        UIImage *image;
    }
    -nel file viewcontroller.m implemento come da te suggerito:
    @implementation XYZViewController
    
    - (id) initWithImageURL:(NSString*)url
    {
        self = [self init];
        if (self)
        {
            //Mi carico l' immagine da url e la assegno al mio attributo image
            image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:url]]];
        }
        return self;
    }
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        //Istanzio la mia imageView e la assegno all'attributo.
        //Come frame gli passo self.view.bounds che corrisponde
        //alle coordinate (0,0,larghezza della view, altezza della view)
        imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
    
        //Setto l' image della "imageView"
        [imageView setImage:image];
        
        //Aggiungo l' imageView alla view mostrata dal controller
        [self.view addSubview:imageView];
    }
    @end
    ecco, arrivato a questo punto non trovo il mio didSelectRowAtIndexPath dove inserire il mio codice
    MyController *cnt = [[MyController alloc] initWithImageURL:[urls objectAtIndex:indexPath.row]];
    self.navigationController pushViewController:cnt animated:YES];
    da quanto ho capito una volta inserito questo codice collego con un push ogni voce della mia table view alla mia UIImageview (o al viewcontroller?) e ad ognuno di questi collegamenti faccio corrispondere un numero dell'array. giusto?


    grazie mille!
  • Re: Differenti metodi per differenti webview

    DidSelectRowAtIndexPath è un metodo del delegato di UITableView, quindi una volta che setti a "self" il delegato della tableView potrai implementare il metodo nel tuo tableViewController in questo modo:
    
    - (void) tableView:(UITableView*)tableView didSelectRowAtIndexPath:(NSIndexPath*)indexPath
    {
        MyController *cnt = [[MyController alloc] initWithImageURL:[urls objectAtIndex:indexPath.row]];
        [self.navigationController pushViewController:cnt animated:YES];
    }
    

    Per settare il delegato della tableView:
    
        tableView.delegate = self; //Fallo nel viewDidLoad
    
  • Re: Differenti metodi per differenti webview

    Grazie mille, provo!
Devi accedere o registrarti per scrivere nel forum
11 risposte