• DevTutorial
  • Libro
  • Guide Mac
  • Giovedi Contest

DevTutorial #8 – UIWebView: create un vostro mini-browser!

The AuthorAndrea Busi The Time8 gennaio 2009 Comments32
separator

Dopo molto tempo eccomi a riscrivere un tutorial sulla programmazione di iPhone. Si tratta di un semplice tutorial che però a me è stato utile per sviluppare (insieme a Fabiano) le applicazioni Calcio e Formula1 di iSpazio.
Vedremo come utilizzare una UIWebView, che ci permetterà di visualizzare una pagina web all’interno di una nostra applicazione! Realizzeremo, in sostanza, un piccolo browser, con tre semplici pulsanti: avanti, indietro e ricarica. Certo, non potremo competere con Safari (anche perchè in ultima analisi è ancora lui a mostrarci la pagina), ma potrebbe tornarci molto utile nelle nostre applicazioni!
Buona programmazione quindi!

1. Creiamo un nuovo progetto

Aprimo Xcode, selezioniamo “File -> New Project”. Nel menù che ci appare selezioniamo “View-based Application”, clicchiamo su “Choose…” e immettiamo come nome “MyBrowser” e fate clic su “Save”. Abbiamo così creato il nostro nuovo progetto.

Prima di definire l’aspetto grafico della nostra applicazione, dichiariamo un componente che ci servirà (sarà il componente principale che caricherà le pagine web).
Apriamo il file “MyBrowserViewController.h” e inseriamo la seguente definizione:

1
2
3
4
5
6
7
#import 
 
@interface MyBrowserViewController : UIViewController {
	IBOutlet UIWebView *webView;
}
 
@end

Abbiamo semplicemente definito una UIWebView, che sarà il componente incaricato di caricare le pagine web. Salviamo il file e apriamo “MyBrowserViewController.xib” per avviare Interface Builder.

2. Creare l’interfaccia grafica dell’applicazione

Il template che abbiamo utilizzato ci fornisce già una vista di base, noi iniziamo inserendo nella parte bassa della vista un componente di tipo UIToolbar e tre bottoni UIBarButtonItem, separando gli ultimi due tramite un “Flexible Space” (anche questo già visto). I primi due bottoni ci serviranno per muoverci tra le pagine visitate (i classici “Avanti” e “Indietro”), mentre il terzo servirà a ricaricare la pagina. Ecco come appare la barra appena definita:

Immagine 2

Ora dobbiamo inserire la WebView. Dalla libreria scegliamo un componente “UIWebView” e inseriamolo nella nostra finestra. Ecco il risultato finale:

Immagine 3

3. Definiamo i componenti e colleghiamo le azioni

Abbiamo già concluso con la definizione dell’interfaccia grafica. Dobbiamo ora definire i componenti che ci serviranno e collegare le relative azioni. Vedrete che si rivelerà tutto molto semplice, in quanto troveremo già tutto pronto.
Iniziamo cliccando sul “File’s Owner” (che troviamo nel Pannello dei documenti) e spostiamoci nel Connections Inspector. Colleghiamo il componente “webView” (che è quello definito all’inizio del tutorial) con la UIWebView che abbiamo appena inserito nella nostra applicazione. Se abbiamo eseguito questo passaggio correttamente avremo un pannello “Connections Inspector” come questo:

Immagine 4

Dopo aver fatto questo semplice collegamento, andiamo ancora nel Pannello dei documenti ed espandiamo il componente View e selezioniamo la UIWebView :

Immagine 5

Andiamo nel “Connections Inspector” e noteremo che ci sono già delle azioni definite (“goBack”, “goForward”, etc.), non dovremo far altro che collegarle con i bottoni adeguati. Ecco le associazioni da fare:

  • “goBack” con il bottone “<“, ovvero per tornare alla pagina precedente;
  • “goForward” con il bottone “>”, ovvero per andare alla pagina successiva (della cronologia);
  • “reload” con il bottone “Ricarica”, per ricaricare la pagina web.

Se avete eseguito tutto correttamente avrete un risultato come questo:

Immagine 6

Tutto molto semplice e veloce! Salviamo tutto e chiudiamo Interface Builder.

4. Inseriamo il codice necessario

Dobbiamo ora inserire il codice che si occupa di caricare la pagina web desiderata e mostrarla nella UIWebView. Utilizziamo un metodo che viene caricato all’avvio dell’applicazione, e che ci permette di settare i comportamenti iniziali del nostro browser.
Aprite il file “MyBrowserViewController.m” e inserite il seguente codice:

1
2
3
4
5
6
7
8
9
10
11
12
13
#import "MyBrowserViewController.h"
 
@implementation MyBrowserViewController
 
-(void)viewDidLoad{
	//indirizzo web da caricare
	NSString *indirizzo = @"http://www.bubidevs.net";
	//crea un oggetto URL
	NSURL *url = [NSURL URLWithString:indirizzo];
	NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];
	// visualizza la pagina nella UIWebView
	[webView loadRequest:requestObj];
}

Come potete vedere si tratta solo di quattro istruzioni!
Definiamo, per prima cosa, l’indirizzo che vogliamo aprire (la variabile “indirizzo”), mentre nelle righe successive inizializiamo i componenti necessari per poter visualizzare la pagina (non preoccupatevi troppo, sono sempre questi da utilizzare). L’ultima istruzione (riga 12), infine, serve a settare i componenti che abbiamo appena creato nella UIWebView, in modo che venga mostrata la pagina web all’utente.

E se volessimo caricare dei file HTML che abbiamo in locale? Semplice, modificate così le righe 7 e 9 del codice precedente:

1
2
NSString *indirizzo = [[NSBundle mainBundle] pathForResource:@"index" ofType:@"html"];
NSURL *url = [NSURL fileURLWithPath:indirizzo];

In questo modo verrà caricato il file “index.html” che si deve trovare, però, nella stessa cartella in cui viene seguita l’applicazione (quindi dovete prima importarla nel vostro progetto). Semplice vero?

Cliccate su “Build and Go!” e provate il vostro personalissimo browser!

Immagine 8

Se Avete Problemi, questo è il file di progetto.

La guida è stata realizzata da Andrea Busi per “Bubi Devs”. I meriti sono del legittimo autore.

separator
Condividi su FriendFeed
separator
Comments
32 Comments
separator
  1. kraken

    ciao (dinuovo)
    Ho seguito la tua ottima guida l’unico problema è che non hai spiegato (magari non volevi :p) come rendere “funzionanti” i tre (o più) tasti nella ToolBar!! :’(
    saresti cosi gentile da spegarmi? :) mercì!
    a presto

    PS
    un altra cosa, per caricare il sito in locale, devo mettere il database nella cartella resources?
    (il percorso come sarebbe)?

    Pps
    scusa la newbaggine!

    ReplicaReplica
  2. kraken

    altra cosa (scusa se rompo)
    potresti dare un occhiata al mio file progetto (completamente simile alla tua guida) che non riesce a partire (ricevo 2 errori!!) o crash sul simulatore…possibilmente (se avrai tempo) potresti dirmi dove sbaglio (sono ore che controllo)

    ReplicaReplica
  3. kraken

    :P dimenticavo il link:
    http://www.sendspace.com/file/9stqp9

    ReplicaReplica
  4. Andrea Busi

    Vero, hai pienamente ragione!!
    Che tonto, mi sono dimenticato, ora provvedo subito a sistemare la guida..

    ok, appena riesco provo a darci un’okkiata (magari anke subito ;-) )

    ReplicaReplica
  5. kraken

    disponibilissimo, grazie mille!

    ReplicaReplica
  6. Andrea Busi

    guida corretta, fammi sapere se trovi ancora errori!

    ora guardo il tuo progetto..

    ReplicaReplica
  7. kraken

    non sono una suocera è! :D :D :D

    comunque:

    “Ora spostiamoci nel file “webViewTutorialController.h”. Dobbiamo scrivere il codice che dica alla nostra applicazione (ed in particolare al componente webView) di caricare una determinata pagina web. Ecco il codice che dovete inserire (all’interno del metodo viewDidLoad che troverete già presente):” credo il file sia: webViewTutorialController.m ;)
    Non è che sono bstardo (non troppo, almeno), è che dicendomi di controllare l’ho fatto per davvero! (la prima volta mi era sfuggito!)

    ReplicaReplica
  8. Andrea Busi

    certo che un po’ suocera lo sei!! scherzo ovviamente..
    grazie, corretto anche questo errore!

    ora guardo il tuo progetto (x davvero xò)..

    ReplicaReplica
  9. iDo

    Io invece non riesco a far caricare dall’applicazione il file html che si trova in locale. Provo ad utilizzare @”file://file.html” ma nada non lo carica.
    Come fò?

    ReplicaReplica
  10. iDo

    Ciao Andrea,
    ho provato a mettere nel codice la stringa @”file://nomefile.html” ma non mi carica la pagina come mai?
    ah la pagina html in questione si trova nella stessa cartella del progetto

    ReplicaReplica
  11. Andrea Busi

    @iDo: ciao, strano.. se invece metti un indirizzo qualsiasi web funziona?
    adex non riesco, ma più tardi provo a madarti un esempio ;-)

    ReplicaReplica
  12. iDo

    Si, se metto qualsiasi indirizzo web va alla grande

    ReplicaReplica
  13. Nicola1975

    Ciao Andrea e ciao a tutti. Sono un principiante che chiede aiuto.
    Ho due problemi con questo tutorial.
    Al punto 3, nella Document Window, trovo solo un componente “View” (quello con toolbar e webview), e non due come mostrato nel tutorial. Le View da inserire sono quindi una o due?
    Inoltre, quando scelgo la suddetta View, nel menu a tendina “Class” dell’Identity Inspector non ho MainView, pur avendo già creato in precedenza la class e salvato il progetto. Perchè non la trovo?
    Grazie.

    ReplicaReplica
  14. Andrea Busi

    @Nicola1975: stasera aggiorno il tutorial, questo ha dei punti sbagliati..
    quello nuovo dovrebbe funzionare ;-)

    ReplicaReplica
  15. Nicola1975

    Grazie Andrea, ora funziona!

    Per quanto riguarda il caricamento di un file locale (ad esempio index.html), ho trovato su internet questa riga di codice da inserire all’interno del metodo viewDidLoad, al posto di tutto il resto:

    [webView loadRequest:[NSURLRequest requestWithURL:[NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@”index” ofType:@”html”]isDirectory:NO]]];

    ReplicaReplica
  16. Andrea Busi

    @Nicola1975: si, così vai a leggere il file “index.hmtl” dalla directory del progetto.. è forse la soluzione migliore quella che hai trovato tu!

    ReplicaReplica
  17. Andrea Busi

    articolo aggiornato, ora carica correttamente anche i file da locale ;-)

    ReplicaReplica
  18. luigi

    ma questa guida la si puo usare in presenza di una tab bar?
    perche ho provato ad eseguirla ma mi da dei problemi nel caricamente della pagina web.
    grazie

    ReplicaReplica
  19. Andrea Busi

    @luigi: certamente si.. prova a controllare di non aver omesso qualche passaggio, perchè deve funzionare ;-)

    ReplicaReplica
  20. luigi

    ciao andrea…lho rifatta piu volte ma nulla.
    Nella Connection Inspector non riesco a trovare il metodo webView da collegare…ora provo direttamente con il tuo file e ti faccio sapere.
    Eventualmente ti passo il file di progetto

    ReplicaReplica
  21. luigi

    Allora ci sono riuscito, era un mio grossolano errore.
    Ho anche collegato la tabbar con UIWebView ma quando nella simulazione cerco di cliccare sul tab relativo l’applicazione smette di rispondere ed è come se si bloccasse!!

    ReplicaReplica
  22. Francesco

    Ho seguito con successo la tua guida per collegare l’applicazione ad un mini sito realizzato appositamente per iphone che tramite una semplice form-query interroga un db MySQL per ottenere informazioni. Mi chiedo se è lecito tuttavia da parte mia imporre la connessione ad un sito web quando lo scopo non è la navigazione e se la cosa non prgeiudichi troppo la qualità del servizio…..
    Ciao e grazie!

    ReplicaReplica
  23. Francesco

    é possibile collegare dei bottoni di una Navigation Bar con la UIWebView magari a pagine specifiche?

    ReplicaReplica
  24. Andrea Busi

    @Francesco: certamente inserisci i componenti che ti servono (ad es la UINavigationBar) e poi inserisci i bottoni, collegandolo alle azioni, proprio come se fossero normalissimi bottoni!

    ReplicaReplica
  25. Francesco

    Ciao andrea,
    volevo ringraziarti per la guida e allo stesso tempo volevo porgerti una domanda.
    visualizzo direttamente da internet un pdf per mezzo di una UIWebView.
    Come posso fare a salvare in locale il pdf visualizzato all’interno della UIWebView?

    Ciao e grazie

    ReplicaReplica
  26. Andrea Busi

    @Francesco: ciao.. non ho ben capito, tu vuoi caricare un pdf da locale, oppure prima accedere da Internet, scaricare il pdf e salvarlo in locale, in modo da non doverlo più scaricare?

    ReplicaReplica
  27. Francesco

    Allora attualmente faccio cosi:
    se il pdf è presente gia in locale visualizzo tramite uiwebview il pdf locale, in caso contrario lo visualizzo come un qualsiasi documento presente in rete e con una funzione fatta ad hoc effettuo il download del file per memorizzarlo in locale.
    Come puoi vedere tale metodo non è ottimizzato in quanto alla fine è come se effettuassi due volte il download dello stesso file.
    vorrei salvare automaticamente il pdf che visualizzo tramite uiwebview prelevandolo come contenuto di quest’ultima

    ReplicaReplica
  28. Marco

    Ciao Andre, la guida è perfetta ma avrei una domanda da farti. Hai presente che in Safari allargando e restringendo le dita, zummi la pagina…come è possibile farlo?

    ReplicaReplica
  29. Andrea Busi

    @Marco: non penso vada implementata come funzione, dovrebbe essere presente di default come comportamento in una UIWebView..

    ReplicaReplica
  30. Marco

    Sono entrato nel mio browser ma facendo come ti ho descritto sopra non succede niente

    ReplicaReplica
  31. Andrea Busi

    @Marco: davvero strano.. non è che la pagina sia già ottimizzata per iPhone?

    ReplicaReplica
separator
A chi è piaciuto questo articolo?
  1. Bubi Devs » XCode Tips&Tricks #12 – Come leggere un pdf in una UIWebView
separator

Scrivi la tua!

© 2010 Bubi Devs. Powered by WordPress Designed by miniMAC
w3c Made in Mac