<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>devAPPUnknown Action &laquo;  &#187; Ignazioc</title>
	<atom:link href="http://www.devapp.it/wordpress/author/ignazioc/feed" rel="self" type="application/rss+xml" />
	<link>http://www.devapp.it/wordpress</link>
	<description>Impara a programmare il tuo iPhone</description>
	<lastBuildDate>Tue, 07 Sep 2010 20:05:49 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>T#058 &#8211; Avviare e visualizzare un video in modalità verticale [portrait]</title>
		<link>http://www.devapp.it/wordpress/t058-avviare-e-visualizzare-un-video-in-modalita-verticale-portrait.html</link>
		<comments>http://www.devapp.it/wordpress/t058-avviare-e-visualizzare-un-video-in-modalita-verticale-portrait.html#comments</comments>
		<pubDate>Sat, 26 Jun 2010 10:23:49 +0000</pubDate>
		<dc:creator>Ignazioc</dc:creator>
				<category><![CDATA[Tutorial Pratici]]></category>
		<category><![CDATA[MPMoviePlayerController]]></category>
		<category><![CDATA[snippets iphone]]></category>
		<category><![CDATA[tips iphone]]></category>
		<category><![CDATA[tutorial programmazione iphone]]></category>
		<category><![CDATA[video verticale]]></category>

		<guid isPermaLink="false">http://www.devapp.it/wordpress/?p=3776</guid>
		<description><![CDATA[Oggi una piccola chicca non documentata dell&#8217;SDK per iphone. Abbiamo visto come sia semplice visualizzare un video sul nostro melafonino, ma preferiremmo visualizzarlo in verticale piuttosto che orizzontale? Nessun problema. Esiste una funzione non documentata della classe MPMoviePlayerController che ci permette di visualizzare i video anche in modalità portrait. Create il vostro progetto e aggiungere]]></description>
			<content:encoded><![CDATA[<p>Oggi una piccola chicca non documentata dell&#8217;SDK per iphone. Abbiamo visto come sia semplice visualizzare un video sul nostro melafonino, ma preferiremmo visualizzarlo in verticale piuttosto che orizzontale? Nessun problema. Esiste una funzione non documentata della classe <strong>MPMoviePlayerController</strong> che ci permette di visualizzare i video anche in modalità portrait.<span id="more-3776"></span></p>
<p>Create il vostro progetto e aggiungere il framwork MediaPlayer. Non dimenticate di inserire anche</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &lt;MediaPlayer/MediaPlayer.h&gt;</span></pre></td></tr></table></div>

<p>in testa alla classe che ospiterà i nostri video.</p>
<p>Io per questo esempio ho creato una piccola funzione</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>playMovie<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>moviename movietype<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>movietype verticalplayer<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>vertical
<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSURL</span> <span style="color: #002200;">*</span>url <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSURL</span> fileURLWithPath<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSBundle</span> mainBundle<span style="color: #002200;">&#93;</span> pathForResource<span style="color: #002200;">:</span>moviename ofType<span style="color: #002200;">:</span>movietype<span style="color: #002200;">&#93;</span>isDirectory<span style="color: #002200;">:</span><span style="color: #a61390;">NO</span><span style="color: #002200;">&#93;</span>;
&nbsp;
	MPMoviePlayerController <span style="color: #002200;">*</span>mp;
	mp <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>MPMoviePlayerController alloc<span style="color: #002200;">&#93;</span> initWithContentURL<span style="color: #002200;">:</span> url<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSNotificationCenter</span> defaultCenter<span style="color: #002200;">&#93;</span> addObserver<span style="color: #002200;">:</span>self selector<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>moviePlayBackDidFinish<span style="color: #002200;">:</span><span style="color: #002200;">&#41;</span> name<span style="color: #002200;">:</span>MPMoviePlayerPlaybackDidFinishNotification object<span style="color: #002200;">:</span>mp<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #002200;">&#91;</span>mp play<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>vertical<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
		<span style="color: #002200;">&#91;</span>mp setOrientation<span style="color: #002200;">:</span> UIDeviceOrientationPortrait animated<span style="color: #002200;">:</span><span style="color: #a61390;">NO</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Questa funzione accetta come parametri il nome del file video, la sua estensione e un boolean che indica se vogliamo visualizzare il video in orizzontale o verticale.</p>
<p>Aggiungete al vostro progetto un file video (io ho usato un file che si chiama 0009.m4v) e create un semplice pulsante che esegua questa funzione:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>buttonPressed<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>sender
<span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>self playMovie<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;0009&quot;</span> movietype<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;m4v&quot;</span> verticalplayer<span style="color: #002200;">:</span>TRUE<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>A questo punto potreste già eseguire il programma e godervi il video in verticale.</p>
<p><center><br />
<a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/06/mpMediaPlayerController.png"><img class="aligncenter size-medium wp-image-3780" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/06/mpMediaPlayerController-156x300.png" alt="" width="156" height="300" /></a><br />
</center></p>
<p>Questo è un piccolo spezzone di codice, io ho aggiunto al mio progetto alcune funzionalità di cui ancora non abbiamo parlato, ma chi è curioso può scaricare l&#8217;intero sorgente da <a href="http://dl.dropbox.com/u/792862/movie.zip" target="_blank">qui</a>.</p>
<p>Un ringraziamento a <a href="http://www.babyblu.it/gianpaolo/index.html" target="_blank">Gianpaolo Fragale</a> per aver, a sua insaputa <img src='http://www.devapp.it/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> , fornito il video usato in questo esempio.</p>
<p><center><br />
<a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/06/1.png"><img class="size-medium wp-image-3783 aligncenter" style="margin: 10px" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/06/1-156x300.png" alt="" width="156" height="300" /></a><br />
</center></p>
]]></content:encoded>
			<wfw:commentRss>http://www.devapp.it/wordpress/t058-avviare-e-visualizzare-un-video-in-modalita-verticale-portrait.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>T#056 &#8211; GuessTheColor: Impariamo creando un giochino per iPhone</title>
		<link>http://www.devapp.it/wordpress/t056-guessthecolor-impariamo-creando-un-giochino-per-iphone.html</link>
		<comments>http://www.devapp.it/wordpress/t056-guessthecolor-impariamo-creando-un-giochino-per-iphone.html#comments</comments>
		<pubDate>Wed, 23 Jun 2010 10:40:31 +0000</pubDate>
		<dc:creator>Ignazioc</dc:creator>
				<category><![CDATA[Tutorial Pratici]]></category>
		<category><![CDATA[game development]]></category>
		<category><![CDATA[random]]></category>
		<category><![CDATA[rgb]]></category>
		<category><![CDATA[UISlider]]></category>

		<guid isPermaLink="false">http://www.devapp.it/wordpress/?p=3740</guid>
		<description><![CDATA[Ed eccoci ad un nuovo appuntamento con la programmazione per iphone. Oggi vedremo di imparare qualcosa sulla programmazione dei nostri amati melafonini sviluppando un semplice giochino che chiameremo GuessTheColor. Come funziona GuessTheColor? Il gioco è molto semplice, viene mostrata al giocatore una view colorata per un paio di secondi, dopo di ciò l&#8217;utente dovrà ricreare]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/06/Colouring_pencils.jpg"><img class="size-medium wp-image-3741 alignleft" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/06/Colouring_pencils-300x199.jpg" alt="" width="270" height="179" /></a></p>
<p>Ed eccoci ad un nuovo appuntamento con la programmazione per iphone. Oggi vedremo di imparare qualcosa sulla programmazione dei nostri amati melafonini sviluppando un semplice giochino che chiameremo <strong>GuessTheColor</strong>.</p>
<h4>Come funziona GuessTheColor?</h4>
<p>Il gioco è molto semplice, viene mostrata al giocatore una view colorata per un paio di secondi, dopo di ciò l&#8217;utente dovrà ricreare il colore che ha visto agendo su 3 slider che regolano la quantità di rosso, di verde e di blu. Semplice, no?<span id="more-3740"></span></p>
<h4>Il progetto</h4>
<p>Questa volta partiamo subito in quarta e apriamo Xcode, scegliamo di creare un progetto di tipo &#8220;view-based application&#8221; e lo chiamiamo <em>guessTheColor</em>.</p>
<p>Ci vogliamo semplificare la vita, quindi utilizzeremo una sola classe, nello specifico utilizzeremo la classe guessTheColorViewController.h</p>
<p>Che cosa ci servirà in questa classe? Sicuramente i tre <em>UISlider</em> per selezionare il colore, poi ci servirà una <em>UIView</em> dove visualizzare il colore da indovinare (quella che verrà nascosta dopo 1 o 2 secondi), ed infine ci serviranno tre valori di tipo <em>float</em> (float sono valori con la virgola) per memorizzare le componenti RGB del colore che dobbiamo indovinare.</p>
<h4>COS&#8217;è RGB?</h4>
<p>Questa piccola digressione è d&#8217;obbligo, sentitevi liberi di andare avanti se sapete già di cosa stiamo parlando.</p>
<p>RGB sono le iniziali di Red (rosso), Green (verde) e Blue (blu) e, che ci crediate o no, tutti colori che state in questo momento guardando sul vostro schermo sono realizzati dosando opportunamente le percentuali di questi tre colori.</p>
<p>A differenza di quello che avviene quando si mescolano i colori a tempera, con i quali se mescolassimo rosso verde (in realtà il giallo <img src='http://www.devapp.it/wordpress/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ) e blu in egual misura otterremmo una sorta di marrone scuro, quello che avviene con gli schermi è che otteniamo invece il bianco. Questa è quella che viene chiamata sintesi additiva.</p>
<p><center><br />
<div id="attachment_3744" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/06/RGB_sintesiAdditiva.png"><img class="size-full wp-image-3744" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/06/RGB_sintesiAdditiva.png" alt="" width="300" height="300" /></a><p class="wp-caption-text">Esempio di sintesi additiva con RGB</p></div><br />
</center></p>
<p>Per specificare un colore, quindi, possiamo semplicemente elencarne le percentuali di rosso, verde e blu.</p>
<p>Storicamente queste percentuali vengono specificate con un intero che va da 0 (0%) a 255 (100%) ma l&#8217;sdk di apple prevede che questi valori vengano forniti come un float che va da 0 (0%) a 1 (100%). Ovviamente non cambia nulla, è solo un problema di proporzioni e di scalatura.</p>
<p>Considerando che in molti sono abituati a  pensare ai colori in termini di valori 0-255 alcuni programmatori usano fornire questi valori usando questa notazione: 127/255. Questo ovviamente da come risultato un float compreso tra 0 e 1 ed ha il vantaggio di essere più chiaro per chi è abituato alla notazione in 255-esimi.</p>
<p>Una piccola nota, puo&#8217; sembrare strano affermare che il bianco è fatto da 100% rosso, 100% verde e 100% blu, ma quello che questa notazione vuol dire è che nel bianco abbiamo la massima quantità di questi tre colori, così come il colore (100%,100%,50%) ha metà blu rispetto alla sua quantità massima.</p>
<h4>TORNIAMO ALLA CREAZIONE DEL NOSTRO GIOCO PER IPHONE</h4>
<p>Stavamo modificando guessTheColorViewController.h, aggiungiamo quindi gli Outlet e le property in questo modo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &lt;UIKit/UIKit.h&gt;</span>
&nbsp;
<span style="color: #a61390;">@interface</span> guessTheColorViewController <span style="color: #002200;">:</span> UIViewController <span style="color: #002200;">&#123;</span>
	UIView <span style="color: #002200;">*</span>secretColorView;
	UISlider <span style="color: #002200;">*</span>sliderred;
	UISlider <span style="color: #002200;">*</span>slidergreen;
	UISlider <span style="color: #002200;">*</span>sliderblue;
	UILabel <span style="color: #002200;">*</span>tentativi;
	<span style="color: #a61390;">float</span> red;
	<span style="color: #a61390;">float</span> green;
	<span style="color: #a61390;">float</span> blue;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> IBOutlet UISlider <span style="color: #002200;">*</span>sliderred;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> IBOutlet UISlider <span style="color: #002200;">*</span>slidergreen;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> IBOutlet UISlider <span style="color: #002200;">*</span>sliderblue;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> IBOutlet UIView	<span style="color: #002200;">*</span>secretColorView;
<span style="color: #a61390;">@end</span></pre></td></tr></table></div>

<p>Non dimentichiamoci di aggiungere al file &#8220;guessTheColorViewController.m&#8221; la relativa voce &#8220;@synthesize&#8221;</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@synthesize</span> sliderred,slidergreen,sliderblue,secretColorView;</pre></td></tr></table></div>

<p>A questo punto possiamo creare l&#8217;interfaccia con Interface Builder, trasciniamo i 3 UISlider e colleghiamoli alla nostra classe cliccando con il tasto destro sull&#8217;icona &#8220;file&#8217;s owner&#8221; della documentwindows e trascinando sopra gli slider.</p>
<p>Questa è il mio progetto:</p>
<p><center><br />
<a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/06/GuessTheColorIB.png"><img class="aligncenter size-medium wp-image-3746" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/06/GuessTheColorIB-295x300.png" alt="Progetto di GuessTheColor in IB" width="295" height="300" /></a><br />
</center></p>
<p>Scriviamo ora la funzione che imposti un colore random per la view &#8220;secretColorView&#8221;, questo è il codice:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBACTION<span style="color: #002200;">&#41;</span>showNextColor
<span style="color: #002200;">&#123;</span>
	red <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">float</span><span style="color: #002200;">&#41;</span><span style="color: #a61390;">rand</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">/</span> <span style="color: #a61390;">RAND_MAX</span><span style="color: #002200;">&#41;</span>;
	green <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">float</span><span style="color: #002200;">&#41;</span><span style="color: #a61390;">rand</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">/</span> <span style="color: #a61390;">RAND_MAX</span><span style="color: #002200;">&#41;</span>;
	blue <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">float</span><span style="color: #002200;">&#41;</span><span style="color: #a61390;">rand</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">/</span> <span style="color: #a61390;">RAND_MAX</span><span style="color: #002200;">&#41;</span>;
	<span style="color: #002200;">&#91;</span>secretColorView setBackgroundColor<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>UIColor colorWithRed<span style="color: #002200;">:</span>red green<span style="color: #002200;">:</span>green blue<span style="color: #002200;">:</span>blue alpha<span style="color: #002200;">:</span><span style="color: #2400d9;">1</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>self performSelector<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>resetView<span style="color: #002200;">&#41;</span> withObject<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span> afterDelay<span style="color: #002200;">:</span><span style="color: #2400d9;">1.5</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Questa funzione si occupa di generare tre valori random utilizzando la funzione <em>rand()</em> ma poichè questi valori non sarebbero compresi nell&#8217;intervallo [0,1] bisogna dividere per la costante <em>RAND_MAX</em>.</p>
<p>Impostiamo poi il colore di fondo della view &#8220;secretColorView&#8221; tramite il metodo &#8220;colorWithRed: green: blue: alpha&#8221; della classe <em>UIColor</em>.</p>
<p>Questo metodo prende in input tre float che corrispondono alle percentuali dei colori RGB e un altro float per il parametro ALPHA che regola la trasparenza. Con Alpha=0 la view è completamente trasparente, con Alpha=1 è completamente opaca.</p>
<p>L&#8217;ultima riga di questa funzione utilizza il metodo &#8220;performSelector&#8221;, gia incontrato nell&#8217;applicazione multithread, in questo caso quello che succede è che viene invocato il metodo &#8220;resetView&#8221; dopo un ritardo di 1.5 secondi.</p>
<p>Questo è un buon sistema quando si vogliono eseguire delle operazioni &#8220;ritardate&#8221; senza voler mettere in ballo NSTimer e altre classi più complesse.</p>
<p>Ma cosa fa la funzione resetView? semplicemente toglie il colore visualizzato nella view e lo sostituisce con un anonimo grigio medio.</p>
<p>il codice è questo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>resetView
<span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>secretColorView setBackgroundColor<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>UIColor colorWithRed<span style="color: #002200;">:</span><span style="color: #2400d9;">0.5</span> green<span style="color: #002200;">:</span><span style="color: #2400d9;">0.5</span> blue<span style="color: #002200;">:</span><span style="color: #2400d9;">0.5</span> alpha<span style="color: #002200;">:</span><span style="color: #2400d9;">1</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>non ci resta che richiamare la funzione &#8220;showNextColor&#8221; all&#8217;avvio dell&#8217;applicazione, magari dentro il metodo viewdidload.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>viewDidLoad <span style="color: #002200;">&#123;</span>
    <span style="color: #002200;">&#91;</span>super viewDidLoad<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>self showNextColor<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Se proviamo ad eseguire l&#8217;applicazione notiamo una cosa fastidiosa, ad ogni avvio viene visualizzato sempre lo stesso colore.<br />
Questo è dovuto alla funzione rand() un generatore di numeri <em>pseudo-random</em> che per funzionare bene necessia che ad ogni avvio venga generato un nuovo seme.</p>
<p>Questa generazione si fa aggiungendo al file <em>main.m</em>, (all&#8217;interno del metodo <em>main</em>) questa riga di codice prima di ogni altra istruzione:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">srand</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">time</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">NULL</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span></pre></td></tr></table></div>

<h4>Proviamo ad indovinare:</h4>
<p>Questa che abbiamo appena realizzato è la prima parte dell&#8217;applicazione, ora dobbiamo realizzare la seconda.vogliamo che  scorrendo con gli slide vari in colore della view, quando pensiamo di aver indovinato il colore che abbiamo visto per un secondo clicchiamo sul pulsante <em>GUESS</em> e verremo informati di quanto siamo stati bravi nel ricordare il colore.</p>
<p>Abbiamo bisogno quindi di un metodo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>slideChanged<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>sender
<span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>secretColorView setBackgroundColor<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>UIColor colorWithRed<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>sliderred value<span style="color: #002200;">&#93;</span> green<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>slidergreen value<span style="color: #002200;">&#93;</span> blue<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>sliderblue value<span style="color: #002200;">&#93;</span> alpha<span style="color: #002200;">=</span><span style="color: #2400d9;">1</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Questo metodo non fa altro che impostare il colore della view &#8220;secretColorView&#8221; con il valore presente nei tre slider.</p>
<p>Da interface builder adesso potremo associare all&#8217;evento &#8220;value changed&#8221; degli slider proprio questo metodo.<br />
Proviamo ad eseguirlo e vediamo come il cambia il colore della view.</p>
<p>Non ci resta che implementare il metodo per la verifica, vogliamo vedere se l&#8217;utente è riuscito a ricordare il colore segreto, per fare questo scriviamo questo metodo e lo associamo all&#8217;evento click sul pulsante &#8220;guess&#8221;:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>guessColor<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>sender
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">float</span> errorerosso <span style="color: #002200;">=</span> <span style="color: #a61390;">fabs</span><span style="color: #002200;">&#40;</span>sliderred.value <span style="color: #002200;">-</span> red<span style="color: #002200;">&#41;</span>;
	<span style="color: #a61390;">float</span> erroregreen <span style="color: #002200;">=</span> <span style="color: #a61390;">fabs</span><span style="color: #002200;">&#40;</span>slidergreen.value <span style="color: #002200;">-</span> green<span style="color: #002200;">&#41;</span>;
	<span style="color: #a61390;">float</span> erroreblue <span style="color: #002200;">=</span> <span style="color: #a61390;">fabs</span><span style="color: #002200;">&#40;</span>sliderblue.value <span style="color: #002200;">-</span> blue<span style="color: #002200;">&#41;</span>;
	<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>msg <span style="color: #002200;">=</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithFormat<span style="color: #002200;">:</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;ERRORE<span style="color: #2400d9;">\n</span>RED: %d%%<span style="color: #2400d9;">\n</span>GREEN: %d%%<span style="color: #2400d9;">\n</span>BLUE: %d%%&quot;</span>,<span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#40;</span>errorerosso <span style="color: #002200;">*</span> <span style="color: #2400d9;">100</span><span style="color: #002200;">&#41;</span>,
					<span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#40;</span>erroregreen <span style="color: #002200;">*</span> <span style="color: #2400d9;">100</span><span style="color: #002200;">&#41;</span>,
					<span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#40;</span>erroreblue <span style="color: #002200;">*</span> <span style="color: #2400d9;">100</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
	UIAlertView <span style="color: #002200;">*</span>alert  <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIAlertView alloc<span style="color: #002200;">&#93;</span> initWithTitle<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;GUESS&quot;</span> message<span style="color: #002200;">:</span>msg delegate<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span> cancelButtonTitle<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;OK&quot;</span> otherButtonTitles<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>alert show<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>alert release<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Calcoliamo per prima cosa quanto i valori che abbiamo selezionato si discostano dai valori che erano stati scelti random, poi creiamo una alertView che ci informi di quanto abbiamo sbagliato.</p>
<p>Con questo la nostra applicazione è terminata, spero che la lettura sia stata utile e piacevole. Attendo i vostri commenti.</p>
<p><center><br />
<div id="attachment_3750" class="wp-caption aligncenter" style="width: 174px"><a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/06/GuessTheColor.png"><img class="size-medium wp-image-3750" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/06/GuessTheColor-164x300.png" alt="" width="164" height="300" /></a><p class="wp-caption-text">Applicazione guessthecolor per devapp</p></div><br />
</center></p>
<p>PS:Ho effettuato alcune modifiche dell&#8217;ultima ora, ho aggiunto un pulsante per richiedere un nuovo colore, il cui metodo da richiamare è  semplicemente &#8220;showNextColor&#8221;. e poi ho creato un pulsate &#8220;mi arrendo&#8221; che visualizza qual&#8217;era la corretta posizione degli slide il codice è questo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>imaloser<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>sender
<span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>sliderred setValue<span style="color: #002200;">:</span>red animated<span style="color: #002200;">:</span><span style="color: #a61390;">YES</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>slidergreen setValue<span style="color: #002200;">:</span>green animated<span style="color: #002200;">:</span><span style="color: #a61390;">YES</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>sliderblue setValue<span style="color: #002200;">:</span>blue animated<span style="color: #002200;">:</span><span style="color: #a61390;">YES</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>secretColorView setBackgroundColor<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>UIColor colorWithRed<span style="color: #002200;">:</span>red green<span style="color: #002200;">:</span>green blue<span style="color: #002200;">:</span>blue alpha<span style="color: #002200;">:</span><span style="color: #2400d9;">1</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Ed ora un breve video del programma in azione.</p>
<p><center><br />
<object width="425" height="344"><param name="movie" value="http://www.youtube.com/v/JGYPbR0EycI&#038;hl=it_IT&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/JGYPbR0EycI&#038;hl=it_IT&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"></embed></object><br />
</center></p>
]]></content:encoded>
			<wfw:commentRss>http://www.devapp.it/wordpress/t056-guessthecolor-impariamo-creando-un-giochino-per-iphone.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>T#051 &#8211; Accedere a Flickr dalle nostre applicazioni iPhone (parte 4)</title>
		<link>http://www.devapp.it/wordpress/t051-accedere-a-flickr-dalle-nostre-applicazioni-iphone-parte-4.html</link>
		<comments>http://www.devapp.it/wordpress/t051-accedere-a-flickr-dalle-nostre-applicazioni-iphone-parte-4.html#comments</comments>
		<pubDate>Thu, 10 Jun 2010 07:30:55 +0000</pubDate>
		<dc:creator>Ignazioc</dc:creator>
				<category><![CDATA[Tutorial Pratici]]></category>
		<category><![CDATA[API Flickr]]></category>
		<category><![CDATA[flickr]]></category>
		<category><![CDATA[Ignazio Calò]]></category>

		<guid isPermaLink="false">http://www.devapp.it/wordpress/?p=3651</guid>
		<description><![CDATA[Ed eccoci arrivati all&#8217;ultima puntata di questo lungo tutorial, vedremo oggi come realizzare una semplice interfaccia grafica per il nostro programma. L&#8217;idea è quella di realizzare un&#8217;unica schermata con quattro pulsanti, due per navigare avanti e indietro nell&#8217;elenco delle foto, un pulsante per salvare la foto su nostro telefono, e un pulsante per avviare il]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/05/logo_flickr.jpg" alt="" width="223" height="111" /> Ed eccoci arrivati all&#8217;ultima puntata di questo lungo tutorial, vedremo oggi come realizzare una semplice interfaccia grafica per il nostro programma.</p>
<p>L&#8217;idea è quella di realizzare un&#8217;unica schermata con quattro pulsanti, due per navigare avanti e indietro nell&#8217;elenco delle foto, un pulsante per salvare la foto su nostro telefono, e un pulsante per avviare il download del file xml da internet.<span id="more-3651"></span></p>
<p>Aggiungeremo inoltre: una label per visualizzare alcune informazioni, un controllo UIActivityview da visualizzare durante le attese, un controllo UIImageView per visualizzare l&#8217;immagine, un array dove memorizzare gli URL delle foto e un intero che memorizzi l&#8217;indice della foto che stiamo visualizzando.</p>
<p>Un bel po&#8217; di roba, no?</p>
<p>Apriamo quindi il nostro caro vecchio progetto, e modifichiamo il file <em>devFlickrViewController.h</em> inserendo queste dichiarazioni:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> devFlickrViewController <span style="color: #002200;">:</span> UIViewController <span style="color: #002200;">&#123;</span>
	UILabel		<span style="color: #002200;">*</span>currentPhotoNum;
	UIImageView	<span style="color: #002200;">*</span>imageView;
	<span style="color: #400080;">NSArray</span>		<span style="color: #002200;">*</span>urlArray;
	<span style="color: #a61390;">int</span>			currentphoto;
	UIActivityIndicatorView <span style="color: #002200;">*</span>act;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic,retain<span style="color: #002200;">&#41;</span> IBOutlet UILabel		<span style="color: #002200;">*</span>currentPhotoNum;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic,retain<span style="color: #002200;">&#41;</span> IBOutlet UIImageView	<span style="color: #002200;">*</span>imageView;
<span style="color: #a61390;">@property</span> <span style="color: #002200;">&#40;</span>nonatomic,retain<span style="color: #002200;">&#41;</span> IBOutlet UIActivityIndicatorView	<span style="color: #002200;">*</span>act;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>nextPhoto;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>prevPhoto;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>savePhoto;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>refreshPhotoList;</pre></td></tr></table></div>

<p>Creiamo l&#8217;interfaccia tramite Interface Builder, quello che vedete in questa foto è il massimo che il mio estro artistico sia riuscito a partorire:</p>
<p><center><br />
<div id="attachment_3653" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/06/Screen-shot-2010-06-09-at-11.05.05-.png"><img class="size-medium wp-image-3653" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/06/Screen-shot-2010-06-09-at-11.05.05--300x176.png" alt="" width="300" height="176" /></a><p class="wp-caption-text">Creazione dell inerfaccia con inteface builder</p></div><br />
</center></p>
<p>Non dimenticate di collegare correttamente gli IBOutlet e di scivere i <em>@syntetize</em> nel file .m (commentate se ci sono difficoltà con questa parte!)</p>
<p>Passiamo ora a scrivere il codice delle funzioni che abbiamo dichiarato, iniziamo da <strong>refreshPhotoList</strong></p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>refreshPhotoList
<span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>act startAnimating<span style="color: #002200;">&#93;</span>;
	interestingness <span style="color: #002200;">*</span>inter <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>interestingness alloc<span style="color: #002200;">&#93;</span> initWithApiKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;MY_APY_KEY_IS_PRIVATE&quot;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>inter downloadXML<span style="color: #002200;">&#93;</span>;
	URLbuilder <span style="color: #002200;">*</span>urlBuilder <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>URLbuilder alloc<span style="color: #002200;">&#93;</span> initWithXMLdata<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>inter getinterestingnessXML<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>urlBuilder startParsing<span style="color: #002200;">&#93;</span>;
	urlArray <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSArray</span> arrayWithArray<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>urlBuilder getURLarray<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span> retain<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #002200;">&#91;</span>inter release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>urlBuilder release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>act stopAnimating<span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Esaminiamo questo codice: per prima cosa visualizziamo la &#8220;rotellina&#8221;, poi istanziamo un oggetto di tipo <em>interestigness</em> e invochiamo su di esso il metodo <em>downloadXML</em> per far si che l&#8217;oggetto recuperi l&#8217;intero file xml dal sito di flickr.</p>
<p>Successivamente istanziamo un oggetto di tipo <em>urlBuilder</em> passando come parametro proprio il file xml appena scaricato e invochiamo su di esso il metodo <em>startParsing</em>.</p>
<p>Ricordiamo che l&#8217;oggetto <em>urlBuilder</em> ha un metdo <em>getURLarray</em> che restituisce l&#8217;array con gli URL delle foto, invochiamo quindi tale metodo e memorizziamo questo array nella variabilie <em>urlArray</em>.</p>
<p>A questo punto possiamo effettuare il release degli oggetti <em>inter</em> e <em>urlBuilder</em>. (nessun tifo calcistico <img src='http://www.devapp.it/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  )</p>
<p>Eseguendo l&#8217;applicazione notiamo una cosa poco gradita, cliccando sul pulsante che avvia questo metodo l&#8217;interfaccia si blocca per qualche secondo durante la fase di download del file xml che come abbiamo visto nella puntata precedente è una chiamata sincrona, inoltre l&#8217;activityview (la rotellina) non viene proprio visualizzata.</p>
<p>Risolveremo questo problema alla fine di questo tutorial, per il momento lasciamolo così.</p>
<p>Dopo aver cliccato sul pulsante refresh ci si aspetta che venga visualizzata la prima foto, creiamo quindi un metodo che chiameremo <em>viewPhotoAtIndex</em>:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>viewPhotoAtIndex<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span><span style="color: #002200;">&#41;</span>position
<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSURL</span> <span style="color: #002200;">*</span>url <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSURL</span> URLWithString<span style="color: #002200;">:</span>	<span style="color: #002200;">&#91;</span>urlArray objectAtIndex<span style="color: #002200;">:</span>position<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #400080;">NSData</span> <span style="color: #002200;">*</span>data <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSData</span> dataWithContentsOfURL<span style="color: #002200;">:</span>url<span style="color: #002200;">&#93;</span>;
	UIImage <span style="color: #002200;">*</span>img <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIImage alloc<span style="color: #002200;">&#93;</span> initWithData<span style="color: #002200;">:</span>data<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>imageView setImage<span style="color: #002200;">:</span>img<span style="color: #002200;">&#93;</span>;
	currentphoto <span style="color: #002200;">=</span> position;
	currentPhotoNum.text <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Foto %d su %d&quot;</span>,position<span style="color: #002200;">+</span><span style="color: #2400d9;">1</span>,<span style="color: #002200;">&#91;</span>urlArray count<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>img release<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Il lavoro svolto da questo medoto dovrebbe essere chiaro, il metodo accetta un intero come parametro, preleva dall&#8217;array degli URL quello in tale posizione, utilizza il metodo <em>dataWithContentsOfURL</em> per effettuare il download della foto, e la visualizza.</p>
<p>Aggiorniamo il valore di <em>currentphoto</em> e visualizziamo nella label il testo &#8220;foto x su y&#8221;.</p>
<p>Ho utilizzato position+1 perchè all&#8217;utente il fatto che gli array siano indicizzati da 0 non interessa, e non sarebbe carino vedere la scritta &#8220;foto 0 su 100&#8243; per la prima foto e &#8220;foto 99 su 100&#8243; per l&#8217;ultima.</p>
<p>Aggiungiamo quindi al metodo precedente (<em>refreshPhotoList</em>), giusto prima della chiusura, la riga</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">&#91;</span>self viewPhotoAtIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

<p>in modo da visualizare la prima foto.</p>
<p>Fatto questo implementare i due metodi <em>nextPhoto</em> e <em>prevPhoto</em> è molto semplice perchè sarà sufficiente scrivere:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>nextPhoto
<span style="color: #002200;">&#123;</span>
<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>currentphoto <span style="color: #002200;">+</span> <span style="color: #2400d9;">1</span>  &lt; <span style="color: #002200;">&#91;</span>urlArray count<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
            <span style="color: #002200;">&#91;</span>self viewPhotoAtIndex<span style="color: #002200;">:</span>currentphoto <span style="color: #002200;">+</span> <span style="color: #2400d9;">1</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">&#125;</span>
&nbsp;
 <span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>prevPhoto <span style="color: #002200;">&#123;</span>
<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>currentphoto <span style="color: #002200;">-</span> <span style="color: #2400d9;">1</span> &gt;<span style="color: #002200;">=</span> <span style="color: #2400d9;">0</span> <span style="color: #002200;">&#41;</span>
<span style="color: #002200;">&#123;</span>
    <span style="color: #002200;">&#91;</span>self viewPhotoAtIndex<span style="color: #002200;">:--</span>currentphoto<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Un semplice controllo ci impedisce di andare &#8220;out of range&#8221; sul nostro array.</p>
<p>Non ci resta che implementare la funzione per salvare l&#8217;immagine su nostro cellulare:</p>
<p>Il comando sarebbe semplice, perché basterebbe questo codice:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>savePhoto <span style="color: #002200;">&#123;</span>
	UIImage <span style="color: #002200;">*</span>img <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>imageView image<span style="color: #002200;">&#93;</span>;
	UIImageWriteToSavedPhotosAlbum<span style="color: #002200;">&#40;</span> img, self ,<span style="color: #a61390;">nil</span>, <span style="color: #a61390;">nil</span> <span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Però in questo caso non potremmo verificare se il salvataggio è andato o meno a buon fine, allora sfruttiamo il terzo parametro di questa funzione è un selector, ovvero è il nome di un&#8217;altra funzione che verrà automaticamente invocata quando il metodo avrà finito di salvare l&#8217;immagine.</p>
<p>Questo avviene perchè il salvataggio è ASINCRONO ovvero parte quando invochiamo questo metodo, ma poi lavora &#8220;per conto suo&#8221;, invocherà il metodo specificato nel selector per informarci dell&#8217;esito dell&#8217;operazione.</p>
<p>Secondo le indicazioni delle apple il metodo deve essere di questa forma.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>image<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIImage <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>image didFinishSavingWithError<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSError</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>error contextInfo<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>contextInfo
<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>message;
	<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>title;
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">!</span>error<span style="color: #002200;">&#41;</span>
	<span style="color: #002200;">&#123;</span>
		title <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Ok&quot;</span>;
		message <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;foto salvata&quot;</span>;
&nbsp;
	<span style="color: #002200;">&#125;</span>
	<span style="color: #a61390;">else</span>
	<span style="color: #002200;">&#123;</span>
		title <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Error&quot;</span>;
		message <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>error description<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #002200;">&#125;</span>
	UIAlertView <span style="color: #002200;">*</span>alert <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIAlertView alloc<span style="color: #002200;">&#93;</span>
						  initWithTitle<span style="color: #002200;">:</span>title
						  message<span style="color: #002200;">:</span>message
						  delegate<span style="color: #002200;">:</span>self
						  cancelButtonTitle<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;OK&quot;</span>
						  otherButtonTitles<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>alert show<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>alert release<span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>a questo punto la funzione per il salvataggio delle foto diventa:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>savePhoto <span style="color: #002200;">&#123;</span>
	UIImage <span style="color: #002200;">*</span>img <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>imageView image<span style="color: #002200;">&#93;</span>;
	UIImageWriteToSavedPhotosAlbum<span style="color: #002200;">&#40;</span> img, self, <span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>image<span style="color: #002200;">:</span>didFinishSavingWithError<span style="color: #002200;">:</span>contextInfo<span style="color: #002200;">:</span><span style="color: #002200;">&#41;</span>, <span style="color: #a61390;">nil</span> <span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>A questo punto il programma sarebbe pure finito, cerchiamo quindi di capire bene il problema del blocco in fase di download del file xml.</p>
<p>Il problema è che il download del file xml è quella che si chiama in gergo una &#8220;chiamata bloccante&#8221; ovvero una funzione o un metodo che impedisce la normale esecuzione del programma fin quando non è terminato.</p>
<p>Per evitare che queste funzioni blocchino quindi tutto il programma bisogna farle eseguire in una sorta di &#8220;sotto-programma&#8221;.</p>
<p>Questi sotto-programmi si chiamano thread e il foundation framework mette a disposizione degli oggetti per crearli e manipolarli comodamente.</p>
<p>Qui ci starebbe la frase di rito: &#8220;non me ne vogliano i più esperti per questa eccessiva esemplificazione&#8221;, frase scritta perlopiù non per scusarsi ma per non dar l&#8217;impressione di essere degli inesperti del settore.</p>
<p>La sintassi per eseguire una funzione bloccante su un thread separato è questa:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSThread</span> detachNewThreadSelector<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>NOME_FUNZIONE<span style="color: #002200;">&#41;</span> toTarget<span style="color: #002200;">:</span>self withObject<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

<p>Sostituiamo quindi il metodo refreshPhotoList con questi tre metodi:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>IBAction<span style="color: #002200;">&#41;</span>refreshPhotoList
<span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>act startAnimating<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span><span style="color: #400080;">NSThread</span> detachNewThreadSelector<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>getXML<span style="color: #002200;">&#41;</span> toTarget<span style="color: #002200;">:</span>self withObject<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>getXML
<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSAutoreleasePool</span> <span style="color: #002200;">*</span>pool <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSAutoreleasePool</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
	interestingness <span style="color: #002200;">*</span>inter <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>interestingness alloc<span style="color: #002200;">&#93;</span> initWithApiKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;bd4890c606144764897cd145bd880d95&quot;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>inter downloadXML<span style="color: #002200;">&#93;</span>;
	URLbuilder <span style="color: #002200;">*</span>urlBuilder <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>URLbuilder alloc<span style="color: #002200;">&#93;</span> initWithXMLdata<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>inter getinterestingnessXML<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>urlBuilder startParsing<span style="color: #002200;">&#93;</span>;
	urlArray <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSArray</span> arrayWithArray<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>urlBuilder getURLarray<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span> retain<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #002200;">&#91;</span>inter release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>urlBuilder release<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #002200;">&#91;</span>self performSelectorOnMainThread<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>getXMLterminated<span style="color: #002200;">&#41;</span> withObject<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span> waitUntilDone<span style="color: #002200;">:</span><span style="color: #a61390;">NO</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>pool drain<span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>getXMLterminated
<span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>self viewPhotoAtIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>act stopAnimating<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Analizziamoli insieme. Nel primo metodo, refreshPhotoList, adesso ci limitiamo a creare un thread separato in cui verrà eseguito il metodo getXML.</p>
<p>Il metodo getXML una volta invocato verrà eseguito su un thread separato quindi è necessario istanziare un nuovo oggetto di tipo NSAutoreleasePool che si occuperà della gestione della memoria.</p>
<p>Potete leggere <a href="http://www.devapp.it/wordpress/l008-%E2%80%93-objective-c-parte-iii.html" target="_blank">questo</a> articolo a tal proposito.</p>
<p>Però vogliamo essere avvisati quando il thread ha finito il suo compito, se non altro perchè dobbiamo far smettere di girare la rotellina!</p>
<p>utilizziamo quindi la funzione:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">&#91;</span>self performSelectorOnMainThread<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>getXMLterminated<span style="color: #002200;">&#41;</span> withObject<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span> waitUntilDone<span style="color: #002200;">:</span><span style="color: #a61390;">NO</span><span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

<p>per eseguire il metodo getXMLterminated nel threadprincipale.</p>
<p>Quando questo metodo quando viene invocato è sintomo che il threadsecondario ha terminato il suo lavoro, quindi possiamo invocare i metodi necessari per visualizzare l&#8217;immagine.</p>
<p><center><br />
<a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/06/flickr_screen-.png"><img class="aligncenter size-medium wp-image-3654" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/06/flickr_screen--157x300.png" alt="" width="157" height="300" /></a><br />
</center></p>
<p>Per chi vuole, può scaricare la mia versione del programma da <a href="http://dl.dropbox.com/u/792862/devFlickr_4a_puntata.zip" target="_blank">qui</a> in cui ho modificato anche le funzioni prevPhoto e nextPhoto per essere eseguite su thread separati.</p>
<p>Spero che questi tutorial siano stati utili, attendo i vostri commenti e le vostre critiche.</p>
<p style="text-align: center"><a href="http://www.devapp.it/wordpress/supporto-applicazioni/parole-vietate-di-ignazio-calo"><img class="aligncenter" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/02/bannerIgnazioc.png" alt="" width="480" height="100" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.devapp.it/wordpress/t051-accedere-a-flickr-dalle-nostre-applicazioni-iphone-parte-4.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>T#048 – Accedere a Flickr dalle nostre applicazioni iPhone (parte 3)</title>
		<link>http://www.devapp.it/wordpress/t048-accedere-a-flickr-dalle-nostre-applicazioni-iphone-parte-3.html</link>
		<comments>http://www.devapp.it/wordpress/t048-accedere-a-flickr-dalle-nostre-applicazioni-iphone-parte-3.html#comments</comments>
		<pubDate>Wed, 02 Jun 2010 07:30:26 +0000</pubDate>
		<dc:creator>Ignazioc</dc:creator>
				<category><![CDATA[Tutorial Pratici]]></category>
		<category><![CDATA[API Flickr]]></category>
		<category><![CDATA[flickr]]></category>
		<category><![CDATA[Ignazio Calò]]></category>
		<category><![CDATA[NSXMLParser]]></category>
		<category><![CDATA[parsing XML]]></category>
		<category><![CDATA[XML iPhone]]></category>

		<guid isPermaLink="false">http://www.devapp.it/wordpress/?p=3585</guid>
		<description><![CDATA[Ed eccoci al terzo appuntamento, come avrete visto l&#8217;applicazione inizia prendere forma, la prima delle tre funzionalità che abbiamo evidentizato è pronta e funzionante. Una precisazione&#8230;lo scopo di questo tutorial non è realizzare un&#8217;applicazione perfetta e priva di difetti, il codice che abbiamo scritto è completamente privo di qualsiasi gestione degli&#8217;errori e questo non è]]></description>
			<content:encoded><![CDATA[<p>Ed eccoci al terzo appuntamento, come avrete visto l&#8217;applicazione inizia prendere forma, la prima delle tre funzionalità che abbiamo evidentizato è pronta e funzionante.<br />
Una precisazione&#8230;lo scopo di questo tutorial non è realizzare un&#8217;applicazione perfetta e priva di difetti, il codice che abbiamo scritto è completamente privo di qualsiasi gestione degli&#8217;errori e questo non è ammissibile in una applicazione seria.<br />
Realizziamo allora la seconda funzionalità del nostro programma, il parser xml.<br />
Vogliamo in pratica realizzare un parser che sia in grado di esaminare il file xml già scaricato e fornire un elenco di url per visualizzare le foto.<span id="more-3585"></span><br />
Creiamo quindi una nuova classe, figlia di NSObject e la chiamiamo URLbuilder (se non sapete come fare leggete la puntata precedente).<br />
Direi che ci servono almeno due variabili, una di tipo NSData che conterrà il file XML per intero e un NSMutableArray che conterrà il risultato del nostro parsing, ovvero gli url delle foto.<br />
Dichiariamo quindi queste due variabili nel file URLbuilder.h in questo modo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@interface</span> URLbuilder <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span> <span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSMutableArray</span>	<span style="color: #002200;">*</span>URLarray;
	<span style="color: #400080;">NSData</span>			<span style="color: #002200;">*</span>XMLdata;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@end</span></pre></td></tr></table></div>

<p>e creiamo i metodi getter e setter come abbiamo visto nella lezione precedente. (prometto che farò un tutorial sull&#8217;uso di property..)</p>
<p>Per i più svogliati ecco il codice:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> setURLarray<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSMutableArray</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>anArray
<span style="color: #002200;">&#123;</span>
	URLarray <span style="color: #002200;">=</span> anArray;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSMutableArray</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>getURLarray
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">return</span> URLarray;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> setXMLdata<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSData</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>data
<span style="color: #002200;">&#123;</span>
	XMLdata <span style="color: #002200;">=</span> data;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSData</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> getXMLdata
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">return</span> XMLdata;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Direi di creare anche un metodo initWithXMLData che ci permetterà, quando utilizzeremo questa classe di inizializzarla e impostare il valore di XMLData in una sola istruzione.<br />
ecco il codice:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>initWithXMLdata<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSData</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>data
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>self <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>super init<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>
    <span style="color: #002200;">&#123;</span>
		<span style="color: #002200;">&#91;</span>self setXMLdata<span style="color: #002200;">:</span>data<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#125;</span>
    <span style="color: #a61390;">return</span> self;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Restano da dichiarare i metodi veri e propri per il parsing del file xml, vi consiglio di leggere (se non l&#8217;avete ancora fatto) i tutorial a tal proposito che trovate su questo stesso sito,io darò per scontato che l&#8217;abbiate fatto, quindi vediamo e commentiamo subito il codice:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSMutableArray</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> startParsing
<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSXMLParser</span> <span style="color: #002200;">*</span>feedParser <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSXMLParser</span> alloc<span style="color: #002200;">&#93;</span> initWithData<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>self getXMLdata<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>feedParser setDelegate<span style="color: #002200;">:</span>self<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>feedParser parse<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>feedParser release<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Questo è il metodo che dobbiamo invocare per avviare il parsing, istanziamo quindi un oggetto di tipo NSXMLParser inizializzandolo con il contentuto del file XML, impostiamo a SELF il delegate e lo avviamo. Infine rilasciamo l&#8217;oggetto per evitare memory leak.<br />
Forse è il caso di specificare che cosa significhi impostare il delegate, perché è un concetto fondamentale della programmazione MVC (model view controller) e quindi della programmazione per iphone.<br />
Abbiamo già parlato di delegate nell&#8217;articolo relativo <a href="http://www.devapp.it/wordpress/uipickerview-e-uidatepicker-guida-all-uso.html" target="_blank">all&#8217;UIPickerView</a>, e anche se parliamo di oggetti diversi la logica che ci sta dietro è identica.<br />
In particolare l&#8217;oggetto NSXMLParser è un parser <em>asincrono</em>, il che significa che una volta lanciata la procedura di parsing il codice non sta &#8220;fermo&#8221; ad aspettare che la procedura termini, sarà il parser stesso ad inviare al proprio delegate specifici messaggi per informarlo di come procede il suo lavoro. Non si può dire lo stesso per esempio del metodo</p>
<pre>[NSData dataWithContentsOfURL:[NSURL URLWithString:fullAddress]];</pre>
<p>che abbiamo utilizzato la scorsa lezione, questo metodo &#8220;blocca&#8221; l&#8217;esecuzione del codice fin quando non ha finito.<br />
Questa sarà una informazione da tenere bene a mente nella creazione dell&#8217;interfaccia grafica, e lo vedremo bene nella prossima lezione.<br />
In pratica impostare il delegate per l&#8217;NSXMLParser significa &#8220;delegare&#8221; una classe a rispondere ai messaggi inviati da questo oggetto. Questo si traduce nell&#8217;implementare alcuni metodi che trovate specificati nella <em><a href="http://developer.apple.com/mac/library/documentation/cocoa/reference/NSXMLParserDelegate_Protocol/Reference/Reference.html" target="_blank">NSXMLParserDelegate Protocol Reference</a></em>, alcuni sono facoltativi, mentre altri sono obbligatori.<br />
Questo potrebbe essere chiamato &#8220;binding dinamico&#8221;, ovvero la possibilità di associare ad un evento (in questo caso il messaggio ricevuto dalla classe NSXMLParser) ad una diversa risposta a seconda di chi quale sia in quel momento il delegate.</p>
<p>Vediamo quindi quali sono i metodi che abbiamo deciso di implementare nel nostro delegate (il che significa anche &#8220;a quali messaggi del parser intendiamo rispondere&#8221;)</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">//INIZIA IL PROCESSO DI PARSING</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> parserDidStartDocument<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSXMLParser</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>parser
<span style="color: #002200;">&#123;</span>
	NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;PARSING STARTED<span style="color: #2400d9;">\n</span>&quot;</span><span style="color: #002200;">&#41;</span>;
	<span style="color: #002200;">&#91;</span>self setURLarray<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableArray</span> arrayWithCapacity<span style="color: #002200;">:</span><span style="color: #2400d9;">100</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Questo metodo viene invocato quando viene avviato il processo di parsing.<br />
Inizializziamo in questo momento l&#8217;array che conterrà gli URL, poiché per impostazione predefinita Flickr manda un file XML contenente le informazioni per recuperare 100 fotografie settiamo la dimensione del nostro array proprio a 100.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> parserDidEndDocument<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSXMLParser</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>parser
<span style="color: #002200;">&#123;</span>
	NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;PARSING TERMINATO<span style="color: #2400d9;">\n</span>&quot;</span><span style="color: #002200;">&#41;</span>;
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>self getURLarray<span style="color: #002200;">&#93;</span> count<span style="color: #002200;">&#93;</span> <span style="color: #002200;">==</span> <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
		NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;ERRORE&quot;</span><span style="color: #002200;">&#41;</span>;
	<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Questo metodo viene invocato quando il parser termina il suo lavoro.<br />
Utilizzo un paio di NSLog per verificare se il parsing è andato a buon fine.<br />
Se l&#8217;array con i link contiene zero elementi questo significa che c&#8217;è stato un errore.</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">//INIZIA IL RICONOSCIMENTO DI UN ELEMENTO</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> parser<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSXMLParser</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>parser
didStartElement<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>elementName
   namespaceURI<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>namespaceURI
  qualifiedName<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>qName
	 attributes<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSDictionary</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>attributeDict
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#91;</span>elementName isEqualToString<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;photo&quot;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
		<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>self getURLarray<span style="color: #002200;">&#93;</span> addObject<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableString</span> stringWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;http://farm%@.static.flickr.com/%@/%@_%@_m.jpg&quot;</span>,
						  <span style="color: #002200;">&#91;</span>attributeDict objectForKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;farm&quot;</span><span style="color: #002200;">&#93;</span>,
						  <span style="color: #002200;">&#91;</span>attributeDict objectForKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;server&quot;</span><span style="color: #002200;">&#93;</span>,
						  <span style="color: #002200;">&#91;</span>attributeDict objectForKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;id&quot;</span><span style="color: #002200;">&#93;</span>,
						  <span style="color: #002200;">&#91;</span>attributeDict objectForKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;secret&quot;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Questo forse è il metodo più importante, viene invocato quando il parser riconosce l&#8217;inizio di un nuovo tag.</p>
<div id="attachment_3591" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/06/flickr_xml.png"><img class="size-full wp-image-3591" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/06/flickr_xml.png" alt="" width="300" height="278" /></a><p class="wp-caption-text">File xml inviato da Flickr</p></div>
<p>Come possiamo vedere da questa immagine, il file XML fornito da Flickr è costituito da un tag &#8220;RSP&#8221; che contiene l&#8217;esito della risposta, poi un tag &#8220;PHOTOS&#8221; che fornisce alcune indicazioni riguardo al numero di foto e di pagine (ricordo che c&#8217;è la possibilità ri richiedere una specifica pagina o un numero specifico di foto anzichè i valori di defaut) e poi un certo numero di tag &#8220;PHOTO&#8221; con tutti i dati delle fotografie.<br />
Noi siamo interessati solo a quest&#8217;ultimo tag, ecco perché nel codice ho scritto</p>
<pre>if ([elementName isEqualToString:@"photo"])</pre>
<p>A questo punto possiamo costruire finalmente l&#8217;URL della foto, per fare questo costruiamo una stringa secondo le istruzioni fornite da flickr a questa pagina: <a href="http://www.flickr.com/services/api/misc.urls.html" target="_blank">http://www.flickr.com/services/api/misc.urls.html</a></p>
<p>Nel codice che ho scritto ho aggiunto &#8220;_m&#8221; perché voglio ottenere l&#8217;url della versione a grandezza media della foto.<br />
Creato quindi l&#8217;url non resta che aggiungerlo all&#8217;array URLarray per scopi futuri.</p>
<p>Come al solito chiediamo un pò di gratificazione dopo tutto questo lavoro, vogliamo quantomeno vedere che cosa abbiamo ottenuto..<br />
modifichiamo quindi il file devFlickrViewController.m e modifichiamo il metodo ViewDidLoad in questo modo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>viewDidLoad <span style="color: #002200;">&#123;</span>
    <span style="color: #002200;">&#91;</span>super viewDidLoad<span style="color: #002200;">&#93;</span>;
	interestingness <span style="color: #002200;">*</span>inter <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>interestingness alloc<span style="color: #002200;">&#93;</span> initWithApiKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;MY_API_KEY_IS_PRIVATE&quot;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #400080;">NSData</span> <span style="color: #002200;">*</span>tmp;
	tmp <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>inter downloadXML<span style="color: #002200;">&#93;</span>;
	URLbuilder <span style="color: #002200;">*</span>urlBuilder <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>URLbuilder alloc<span style="color: #002200;">&#93;</span> initWithXMLdata<span style="color: #002200;">:</span>tmp<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>urlBuilder startParsing<span style="color: #002200;">&#93;</span>;
	NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;%@&quot;</span>,<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>urlBuilder getURLarray<span style="color: #002200;">&#93;</span> description<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Eseguendo l&#8217;applicazione ed esaminando la console vedremo finalmente gli url delle foto.</p>
<p><a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/06/flickr_url.png"><img class="aligncenter size-medium wp-image-3592" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/06/flickr_url-300x166.png" alt="" width="300" height="166" /></a></p>
<p>Utilizzeremo questo array nella prossima lezione per visualizzare le foto nella nostra applicazione, questo ci permetterà di affrontare il problema dei thread, quindi NON MANCATE!</p>
<p>Chi volesse può scaricare il file del progetto con le modifiche fin&#8217; ora apportate da <a href="http://dl.dropbox.com/u/792862/devFlickr_3puntata.zip">qui</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.devapp.it/wordpress/t048-accedere-a-flickr-dalle-nostre-applicazioni-iphone-parte-3.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Un orologio binario con 26 iPod Touch! [video]</title>
		<link>http://www.devapp.it/wordpress/un-orologio-binario-con-26-ipod-touch-video.html</link>
		<comments>http://www.devapp.it/wordpress/un-orologio-binario-con-26-ipod-touch-video.html#comments</comments>
		<pubDate>Mon, 31 May 2010 07:30:10 +0000</pubDate>
		<dc:creator>Ignazioc</dc:creator>
				<category><![CDATA[Comunicazioni]]></category>
		<category><![CDATA[Ignazio Calò]]></category>
		<category><![CDATA[iPod Touch]]></category>
		<category><![CDATA[orologio binario]]></category>

		<guid isPermaLink="false">http://www.devapp.it/wordpress/?p=3510</guid>
		<description><![CDATA[Mettete in una stanza per una notte 4 pazzi con il pallino per la programmazione, 26 ipod e un server linux e  quello che ne otterrete potrebbe essere sorprendente. Quello che vedete in questo video è un orologio binario (http://it.wikipedia.org/wiki/Orologio_binario) in notazione BCD realizzato da me (IgnazioC) e da Gall0ws, antò e valepert 3 miei]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/05/ipod_bin_clock.png"><img class="size-full wp-image-3515 alignleft" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/05/ipod_bin_clock.png" alt="" width="258" height="163" /></a></p>
<p>Mettete in una stanza per una notte 4 pazzi con il pallino per la programmazione, 26 ipod e un server linux e  quello che ne otterrete potrebbe essere sorprendente.</p>
<p>Quello che vedete in questo video è un orologio binario (<a href="http://it.wikipedia.org/wiki/Orologio_binario" target="_blank">http://it.wikipedia.org/wiki/Orologio_binario</a>) in notazione BCD realizzato da me (IgnazioC) e da Gall0ws, antò e valepert 3 miei carissimi amici nonché folli compagni d&#8217;avventura.</p>
<p>Il tutto è stato realizzato utilizzando 26 ipod e un server linux e sfrutta la comunicazione wifi per la sincronizzazione.<span id="more-3510"></span></p>
<p>Chiedo scusa per la qualità del video, purtroppo l&#8217;idea di questa realizzazione è arrivata in un momento in cui non avevamo altro che la cam del mio mac e un cellulare.</p>
<p>Se qualcuno fosse interessato ad una realizzazione simile.. consideri che questo rappresenta solo un prototipo, le realizzazioni possibili sono pressocchè infinite, pensate ad un mega schermo fatto di iPod su cui gira ad esempio un video.. basta solo avere un numero sufficientemente grande di dispositivi. Per ogni curiosità non esitate a contattarci.</p>
<p><center><br />
<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/EHvNGZ1hvNM&#038;hl=it_IT&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/EHvNGZ1hvNM&#038;hl=it_IT&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object><br />
</center></p>
]]></content:encoded>
			<wfw:commentRss>http://www.devapp.it/wordpress/un-orologio-binario-con-26-ipod-touch-video.html/feed</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>T#047 – Accedere a Flickr dalle nostre applicazioni iPhone (parte 2)</title>
		<link>http://www.devapp.it/wordpress/t047-accedere-a-flickr-dalle-nostre-applicazioni-iphone-parte-2.html</link>
		<comments>http://www.devapp.it/wordpress/t047-accedere-a-flickr-dalle-nostre-applicazioni-iphone-parte-2.html#comments</comments>
		<pubDate>Sun, 30 May 2010 09:35:19 +0000</pubDate>
		<dc:creator>Ignazioc</dc:creator>
				<category><![CDATA[Tutorial Pratici]]></category>
		<category><![CDATA[API Flickr]]></category>
		<category><![CDATA[flickr]]></category>
		<category><![CDATA[Ignazio Calò]]></category>
		<category><![CDATA[tutorial Xcode]]></category>

		<guid isPermaLink="false">http://www.devapp.it/wordpress/?p=3520</guid>
		<description><![CDATA[Ed eccocci alla seconda parte di questo tutorial, oggi inizieremo finalmente a scrivere un pò di codice. Facciamo il punto della situazione, nella prima parte di questa guida abbiamo imparato che per ottenere il file xml contente tutte le info riguardanti le foto che vogliamo scaricare bisogna fare una chiamata http verso un particolare indirizzo.]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/05/logo_flickr.jpg" alt="" width="223" height="111" /></p>
<p>Ed eccocci alla seconda parte di questo tutorial, oggi inizieremo finalmente a scrivere un pò di codice.</p>
<p>Facciamo il punto della situazione, nella prima parte di questa guida abbiamo imparato che per ottenere il file xml contente tutte le info riguardanti le foto che vogliamo scaricare bisogna fare una chiamata http verso un particolare indirizzo. Una volta ottenuto questo file xml bisognerà poi analizzarlo per recuperare tutte le info necessarie per scaricare e visualizzare le fotografie nel nostro programma.</p>
<p>Vedremo via via come inserire queste funzionalità all&#8217;interno della nostra applicazione, ma prima di partire dovremmo avere almeno uno stralcio di piano.<span id="more-3520"></span></p>
<p>Il buon senso del programmatore insegna che è sempre bene tenere distinte le funzionalità di un programma, al fine di renderlo più facile da mantenere, correggere e riutilizzare.</p>
<p>In questo nostro programma si notano almeno tre &#8220;parti&#8221; distinte..abbiamo la parte che si occupa di scaricare il file xml, la parte che si occupa di eseguire il parsing  e di generare gli url delle fotografie e la parte che le visualizza sullo schermo, tenteremo per quanto ci è possibile di tenere separate queste funzionalità.</p>
<p>Forti di questo piano creiamo un nuovo progetto con Xcode, consiglio di utilizzare <em>View-based application</em> come tipologia di progetto, e di chiamarlo <em>devFlickr</em>.</p>
<p>Ovviamente il nome non ha nessuna importanza ma se utilizzate lo stesso nome che ho usato io avrete meno difficoltà a seguire gli esempi.</p>
<p>La prima cosa che vogliamo fare è costruire una classe il cui compito è quello di scaricare il file xml dal sito di flickr.</p>
<p>Per far questo creiamo una nuova classe cliccando sul menù &#8220;file&#8221; e successivamente su &#8220;new file&#8221;. Dalla finestra che appare selezioniamo &#8220;objective-c class&#8221; dalla categoria &#8220;Cocoa Touch Class&#8221; avendo cura che nel menù a tendina in basso alla voce &#8220;subclass of&#8221; sia selezionato &#8220;NSObject&#8221;.</p>
<p>Chiamiamo la nostra classe &#8220;interestingness.m&#8221; e assicuriamoci che sia spuntata la casella &#8220;also create .h file&#8221;</p>
<p><strong>NOTA:</strong> <em>Questa che abbiamo appena eseguito è la procedura standard per la creazione di una nuova classe che eredita direttamente da NSObject, negli esempi a seguire quando ci capiterà di crearne altre, potrete fare riferimento a questo testo.</em></p>
<p>Questa classe avrà bisogno di almeno due membri, uno conterrà il file XML scaricato dal sito di flick e sarà di tipo NSData, l&#8217;altro lo utilizzeremo per memorizzare  la chiave API  ed è di tipo NSString.</p>
<p><strong>NOTA:</strong> <em>Una precisazione, mi capiterà di utilizzare i termini &#8220;membro&#8221;, &#8220;variabile&#8221;, &#8220;proprietà&#8221;&#8230;in realtà questi tre termini avrebbero significati diversi, ma per i nostri scopi questi termini indicano tutti il concetto di variabile interna di una classe.</em></p>
<p>Ricordiamo che questa classe eseguirà il download del file xml da un url costruito appositamente secondo le specifiche di flickr, però la prima parte di questo url è fissa, possiamo quindi, per rendere più leggibile il codice, inserirla in un costrutto <em>#define</em>.</p>
<p>A questo punto il file interestingness.h sarà questo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &lt;Foundation/Foundation.h&gt;</span>
<span style="color: #6e371a;">#define INTERESTIGNESS_BASE_URL @&quot;http://api.flickr.com/services/rest/?method=flickr.interestingness.getList&quot;</span>
&nbsp;
<span style="color: #a61390;">@interface</span> interestingness <span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span> <span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSData</span>		<span style="color: #002200;">*</span>interestingnessXML;
	<span style="color: #400080;">NSString</span>	<span style="color: #002200;">*</span>apikey;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@end</span></pre></td></tr></table></div>

<p>Per chi non avesse mai incontrato il costrutto #define chiariamo che molto semplicemente durante la fase di compliazione tutte le occorrenze nel nostro codice del termine INTERESTIGNESS_BASE_URL vengono sostituite con la stringa</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;http://api.flickr.com/services/rest/?method=flickr.interestingness.getList&quot;</span></pre></div></div>

<p>Passiamo ora al file <em>interestingness.m</em>, ovvero all&#8217;implementazione della nostra classe.</p>
<p>Avrete notato che non ho dichiarato come @property i membri della classe, inoltre non ho utilizzato neanche @syntetize, questo perchè ho notato che questi costrutti, che nascono per semplificare la vita al programmatore, in realtà confondono chi è alle prime armi.</p>
<p>Provvediamo quindi a creare (alla vecchia maniera) i medoti getter e setter per i membri che abbiamo definito, non sono altro che i metodi che dovremo invocare per leggere e scrivere i valori delle due variabili.</p>
<p>aggiungiamo quindi nel file questi metodi:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSData</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>getinterestingnessXML
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">return</span> interestingnessXML;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> setinterestignessXML<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSData</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>anXML
<span style="color: #002200;">&#123;</span>
	interestingnessXML <span style="color: #002200;">=</span> anXML;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>getapikey
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">return</span> apikey;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> setapikey<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>anApiKey
<span style="color: #002200;">&#123;</span>
	apikey <span style="color: #002200;">=</span> anApiKey;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Poichè chi utilizzerà questa nostra classe dovrà necessariamente, dopo averla istanziata, settare il valore di apikey, potrebbe essere carino fornire un metodo per fare entrambe le cose insieme.</p>
<p>creiamo quindi un nostro metodo initWithApiKey in questo modo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>initWithApiKey<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>anApiKey
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>self <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>super init<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>
    <span style="color: #002200;">&#123;</span>
		<span style="color: #002200;">&#91;</span>self setapikey<span style="color: #002200;">:</span>anApiKey<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#125;</span>
    <span style="color: #a61390;">return</span> self;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Cosa fa questo frammento di codice? Serve per inizializzare l&#8217;oggetto, ovvero ad assegnare a tutte le variabili all&#8217;interno dell&#8217;oggetto i valori appropriati.</p>
<p>Ma il nostro oggetto eredita da NSObject quindi durante l&#8217;inizializzazione dobbiamo per prima cosa invocare il metodo init di NSObject (la nostra super-classe) in modo che l&#8217;oggetto stesso venga inizializzato. Viceversa se non avessimo scritto [super init] l&#8217;oggetto non sarebbe stato inizializzato ed il tentare di impostare [self setapikey] avrebbe generato chiaramente un errore.</p>
<p>Vediamo ora il metodo per effettuare il vero e proprio download del file.</p>
<p>Il codice è il seguente:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSData</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>downloadXML
<span style="color: #002200;">&#123;</span>
&nbsp;
	<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>fullAddress <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;%@&amp;amp;api_key=%@&quot;</span>,FLICKR_INTERESTIGNESS_GETLIST_URL,<span style="color: #002200;">&#91;</span>self getapikey<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #400080;">NSData</span> <span style="color: #002200;">*</span>tmp <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSData</span> dataWithContentsOfURL<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSURL</span> URLWithString<span style="color: #002200;">:</span>fullAddress<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>self setinterestignessXML<span style="color: #002200;">:</span>tmp<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>per prima cosa costruiamo l&#8217;indirizzo vero e proprio, poi utilizziamo il metodo <strong>dataWithContentsOfURL</strong> per effettuare il download del file xml, infine utilizziamo il metodo setter per assegnare alla variabile interestignessXML il valore corretto.</p>
<p>Con questo la nostra prima classe è quasi terminata.</p>
<p>Per completezza dovremmo inserire le dichiarazioni dei metodi all&#8217;interno del file .h per evitare warning in fase di compilazione e per aiutare Xcode con l&#8217;autocompletamento.</p>
<p>A questo punto potreste avere la smania di vedere all&#8217;opera questa classe&#8230;ancora non è il momento, ma se proprio non state nella pelle fate così:</p>
<p>editate il file <em>devFlickrViewController.m</em> aggiungendo in alto la stringa</p>
<p><em>#import &#8220;interestingness.h&#8221;</em></p>
<p>inoltre aggiungiamo questo metodo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>viewDidLoad <span style="color: #002200;">&#123;</span>
    <span style="color: #002200;">&#91;</span>super viewDidLoad<span style="color: #002200;">&#93;</span>;
	interestingness <span style="color: #002200;">*</span>inter <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>interestingness alloc<span style="color: #002200;">&#93;</span> initWithApiKey<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;TUA_API_KEY&quot;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>inter downloadXML<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">printf</span><span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">&quot;FILE XML:<span style="color: #2400d9;">\n</span> %s&quot;</span>,<span style="color: #002200;">&#40;</span><span style="color: #a61390;">char</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>inter getinterestingnessXML<span style="color: #002200;">&#93;</span> bytes<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Cosa stiamo facendo?</p>
<p>Dichiariamo un oggetto di tipo &#8220;<em>interestigness</em>&#8220;, lo allochiamo e lo inizializziamo con il metodo &#8220;<em>initWithApiKey</em>&#8220;. Poi invochiamo il metodo &#8220;<em>downloadXML</em>&#8221; dell&#8217;oggetto appena dichiarato e infine accediamo alla sua proprietà &#8220;<em>interestighessXML</em>&#8221; attraverso il metodo &#8220;<em>getInterestignessXML</em>&#8220;.</p>
<p>Non fate caso al cast (char *)&#8230;serve in questo momento solo per far visualizzare il tutto sulla console.</p>
<p>Provate ad eseguire il tutto, dovreste vedere sul simulatore una semplice schermata grigia, mentre sulla console dovreste riuscire a vedere l&#8217;intero file XML appena scaricato.</p>
<p style="text-align: left">
Chi volesse può scaricare il file di Xcode con le modifiche apportate fino a questo punto da questo indirizzo: <a href="http://dl.dropbox.com/u/792862/devFlickr.zip" target="_blank">devFlickr Source Code</a>
</p>
<p style="text-align: center">
<p style="text-align: center">
<p style="text-align: center"><a href="http://www.devapp.it/wordpress/supporto-applicazioni/parole-vietate-di-ignazio-calo"><img class="aligncenter" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/02/bannerIgnazioc.png" alt="" width="480" height="100" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.devapp.it/wordpress/t047-accedere-a-flickr-dalle-nostre-applicazioni-iphone-parte-2.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>T#046 &#8211; Accedere a Flickr dalle nostre applicazioni iPhone (parte 1)</title>
		<link>http://www.devapp.it/wordpress/t046-accedere-a-flickr-dalle-nostre-applicazioni-iphone-parte-1.html</link>
		<comments>http://www.devapp.it/wordpress/t046-accedere-a-flickr-dalle-nostre-applicazioni-iphone-parte-1.html#comments</comments>
		<pubDate>Thu, 27 May 2010 08:57:08 +0000</pubDate>
		<dc:creator>Ignazioc</dc:creator>
				<category><![CDATA[Tutorial Pratici]]></category>
		<category><![CDATA[API Flickr]]></category>
		<category><![CDATA[flickr]]></category>
		<category><![CDATA[Ignazio Calò]]></category>
		<category><![CDATA[rest]]></category>

		<guid isPermaLink="false">http://www.devapp.it/wordpress/?p=3435</guid>
		<description><![CDATA[In questo tutorial cercheremo di costruire insieme un&#8217;applicazione perfettamente funzionante che racchiuda parte dei concetti che abbiamo già trattato in altri toutorial e concetti nuovi che verranno affrontati qui per la prima volta. Come sempre cercherò di costruire l&#8217;applicazione per approssimazioni successive, ponendo l&#8217;accento su quelli che possono essere gli errori più comuni nello sviluppo]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/05/logo_flickr.jpg"><img src="http://www.devapp.it/wordpress/wp-content/uploads/2010/05/logo_flickr.jpg" alt="Logo Flickr" title="logo_flickr" width="223" height="111" class="alignleft size-full wp-image-3494" /></a> In questo tutorial cercheremo di costruire insieme un&#8217;applicazione perfettamente funzionante che racchiuda parte dei concetti che abbiamo già trattato in altri toutorial e concetti nuovi che verranno affrontati qui per la prima volta.</p>
<p>Come sempre cercherò di costruire l&#8217;applicazione per approssimazioni successive, ponendo l&#8217;accento su quelli che possono essere gli errori più comuni nello sviluppo di un app completa.</p>
<p>In questa prima parte non ci occuperemo della parte di sviluppo su iphone, ma sarà una introduzione generale all&#8217;utilizzo delle <strong>API di Flickr</strong> ed al <strong>protocollo REST</strong> in genere.<span id="more-3435"></span></p>
<h4>Il progetto:</h4>
<p>L&#8217;applicazione che vogliamo realizzare è un semplice cient per Flickr, quello che vogliamo fare è riuscire a scaricare e visulizzare le foto che flickr marca come &#8220;interessanti&#8221;. Questo elenco viene aggiornato quotidianamente quindi ogni giorno l&#8217;applicazione fornirà foto diverse.</p>
<p>Suppongo che tutti i lettori conoscano il servizio offerto da Flickr (in caso contrario vi esorto a visitare il sito <a href="http://www.flickr.com/" target=_blank">flickr.com</a>), ma magari non tutti sanno che flickr offre un ottimo e documentatissimo seti di API (Application Programming Interface) per accedere al suo database.</p>
<p>Ma come si fa ad usare queste API? Flickr mette a disposizione ben tre sistemi diversi, SOAP, XML-RPC e REST. Per la sua semplicità e versatilità noi utilizzeremo proprio quest&#8217;ultimo. Accedere alle API flickr tramite REST significa, in breve, costruire un particolare URL secondo le istruzioni fornite da flickr stesso, effettuare una chiamata HTTP su questo URL e analizzare il contenuto della risposta del server. Più facile a farsi che a dirsi, sarà tutto più chiaro proseguendo nella lettura.</p>
<h4>Iniziamo</h4>
<p>:</p>
<p>La prima cosa da fare è quella di registrarsi su Flickr e richiedere una propria <strong>API_KEY</strong>, una stringa alfanumerica che servirà per identificare le nostre applicazioni.</p>
<p>La pagina da visistare è questa:</p>
<p><a href="http://www.flickr.com/services/api/" target="_blank">http://www.flickr.com/services/api/</a></p>
<p>Una volta registrati potremo cliccare sul link &#8220;<em>api keys</em>&#8221; per richiedere la nostra key personale.</p>
<p>Ottenuta la nostra chiave, diamo uno sguardo alla pagina <a href="http://www.flickr.com/services/api/" target="_blank">http://www.flickr.com/services/api/</a>, da questa pagina è possibile accedere a tutta la documentazione che flickr fornisce per le sue api.</p>
<p>Cliccando su &#8220;request formats &#8211; REST&#8221; prendiamo nota che gl indirizzi URL da realizzare sono nella forma:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">http://api.flickr.com/services/rest/?method=flickr.test.echo&amp;name=value</pre></td></tr></table></div>

<p>In questo caso stiamo chiamando la funzione &#8220;flickr.test.echo&#8221; passando &#8220;value&#8221; come argomento per il parametro &#8220;name&#8221;.</p>
<p>Ottenute queste informazioni generali, possiamo vedere nello specifico la funzione  <strong>flickr.interestingness.getList</strong> a questa pagina:</p>
<p><a href="http://www.flickr.com/services/api/flickr.interestingness.getList.html" target="_blank">http://www.flickr.com/services/api/flickr.interestingness.getList.html</a></p>
<p>questa funzione restituisce la lista delle foto interessanti del giorno stesso e della data specificata, e richiede come unico parametro non opzionale la propria api key</p>
<p>L&#8217;url quindi da interrogare sarà questo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">http://api.flickr.com/services/rest/?method=flickr.interestingness.getList&amp;api_key=aa9999a999999999999aa999aa999a99</pre></td></tr></table></div>

<p>(ovviamente al posto di &#8220;<em>aa9999a999999999999aa999aa999a99</em>&#8221; dovete inserire la vostra apikey)</p>
<p>Possiamo fare già una prima prova, apriamo il nostro browser e copiamo nella barra dell&#8217;indirizzo l&#8217;url che abbiamo costruito e premiamo invio. quello che vedremo sarà un file XML contentente tutte le informazioni necessarie per recuperare e visualizzare le  immagini.</p>
<p>(con alcuni browser, tra cui Chrome e Safari, viene visualizzata una pagina bianca, in quel caso bisogna semplicemente visualizzare il sorgente della pagina per esaminare il file XML).</p>
<p>La risposta di flickr ha questa struttura:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">&lt;rsp stat=&quot;ok&quot;&gt;
&lt;photos page=&quot;1&quot; pages=&quot;5&quot; perpage=&quot;100&quot; total=&quot;500&quot;&gt;
&lt;photo id=&quot;4615393244&quot; owner=&quot;9049132@N04&quot; secret=&quot;e2e21720d6&quot; server=&quot;3360&quot; farm=&quot;4&quot; title=&quot;my good boy &amp;amp; my new toy&quot; ispublic=&quot;1&quot; isfriend=&quot;0&quot; isfamily=&quot;0&quot; /&gt;
&lt;photo id=&quot;4614986043&quot; owner=&quot;41049110@N02&quot; secret=&quot;3222884afd&quot; server=&quot;4051&quot; farm=&quot;5&quot; title=&quot;Mountain Hare Rolling in Snow&quot; ispublic=&quot;1&quot; isfriend=&quot;0&quot; isfamily=&quot;0&quot; /&gt;
&lt;photo id=&quot;4615636115&quot; owner=&quot;32131681@N00&quot; secret=&quot;a38974b053&quot; server=&quot;4066&quot; farm=&quot;5&quot; title=&quot;Cully&quot; ispublic=&quot;1&quot; isfriend=&quot;0&quot; isfamily=&quot;0&quot; /&gt;
&lt;/photos&gt;
&lt;/rsp&gt;</pre></td></tr></table></div>

<p>Resta da capire come ottenere, a partire da questo file xml l&#8217;immagine in questione!</p>
<p>Per far questo basterà consultare la solita documentazione fornita da flickr visibile a questo indirizzo:</p>
<p><a href="http://www.flickr.com/services/api/misc.urls.html" target="_blank">http://www.flickr.com/services/api/misc.urls.html</a></p>
<p>La pagina è in inglese, ma credo che gli esempi siano piuttosto chiari, lo schema url che useremo sarà il seguente:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">http://farm{farm-id}.static.flickr.com/{server-id}/{id}_{secret}.jpg</pre></td></tr></table></div>

<p>per visualizzare la prima foto presente nel file xml quindi sarà visibile all&#8217;indirizzo:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="text" style="font-family:monospace;">http://farm4.static.flickr.com/3360/4615393244_e2e21720d6.jpg</pre></td></tr></table></div>

<p>A questo punto possiamo avere già un&#8217;idea di come dovrà funzionare na nostra applicazione, per prima cosa dovrà scaricare il file xml contenente tutte le informazioni necessarie, poi bisognerà parsare questo file per ottenere i singoli valori (leggete l&#8217;ottimo <a href="http://www.devapp.it/wordpress/t042-come-utilizzare-xml-nelle-nostre-applicazioni-iphone-sdk.html" target="_blank">tutorial di Andrea Busi</a> a tal proposito) e successivamente potremo costruire tutti gli url delle immagini per visualizzarle e salvarle sul nostro iphone.</p>
<p>alla prossima puntata!</p>
<p style="text-align: center"><a href="http://www.devapp.it/wordpress/supporto-applicazioni/parole-vietate-di-ignazio-calo"><img class="aligncenter" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/02/bannerIgnazioc.png" alt="" width="480" height="100" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.devapp.it/wordpress/t046-accedere-a-flickr-dalle-nostre-applicazioni-iphone-parte-1.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>UIPickerView e UIDatePicker &#8211; Guida all&#8217;uso</title>
		<link>http://www.devapp.it/wordpress/uipickerview-e-uidatepicker-guida-all-uso.html</link>
		<comments>http://www.devapp.it/wordpress/uipickerview-e-uidatepicker-guida-all-uso.html#comments</comments>
		<pubDate>Fri, 23 Apr 2010 08:27:20 +0000</pubDate>
		<dc:creator>Ignazioc</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[UIDatePicker]]></category>
		<category><![CDATA[uikit]]></category>
		<category><![CDATA[uipickerview]]></category>

		<guid isPermaLink="false">http://www.devapp.it/wordpress/?p=3148</guid>
		<description><![CDATA[Nella guida di oggi approfondiremo un componente molto utilizzato all&#8217;interno delle applicazioni per iphone, stiamo parlando di UIPickerView (e UIDatePicker). Lo studio di questi due oggetti ci permetterà di chiarire il concetto di delegate e di vedere all&#8217;opera il paradigma mvc (model-view-controller) Diamo un&#8217;occhiata alla gerarchia delle classi per capire di cosa ci occupiamo oggi:]]></description>
			<content:encoded><![CDATA[<p>Nella guida di oggi approfondiremo un componente molto utilizzato all&#8217;interno delle applicazioni per iphone, stiamo parlando di <strong>UIPickerView</strong> (e UIDatePicker).<br />
Lo studio di questi due oggetti ci permetterà di chiarire il concetto di delegate e di vedere all&#8217;opera il paradigma mvc (model-view-controller)<br />
Diamo un&#8217;occhiata alla gerarchia delle classi per capire di cosa ci occupiamo oggi:</p>
<p><center><br />
<div id="attachment_3149" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/04/gerarchia-uipickerview.png"><img class="size-medium wp-image-3149" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/04/gerarchia-uipickerview-300x109.png" alt="" width="300" height="109" /></a><p class="wp-caption-text">Gerarchia delle classi UIPickerView e UIDatePicker</p></div><br />
</center><span id="more-3148"></span></p>
<p>Come nostra consuetudine i nomi bordati in verde si riferiscono a classi già trattate su questo stesso sito [<a href="http://alturl.com/7yyp" target="_blank">qui</a>], mentre quelli bordati in rosso sono quelle che analizzeremo in questo articolo.</p>
<p>Concorderete con me che non c&#8217;è sistema migliore per studiare una classe se non quella di scaricare la <strong>class reference</strong> dal sito della apple, (ok, ok, a parte leggere il sorgente <img src='http://www.devapp.it/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ) ecco quindi due link per un facile download:</p>
<p><a href="http://alturl.com/qo53" target="_blank">UIPickerView Class Reference</a><br />
<a href="http://alturl.com/gz7v" target="_blank">UIDatePicker Class Reference</a></p>
<p>Iniziamo analizzando il più semplice tra i due, l&#8217; <strong>UIDatePicker</strong> (che non necessita di delegate) trasciniamone uno su una view oppure inserendo questo codice per generarlo a runtime:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">UIDatePicker <span style="color: #002200;">*</span>datePicker;
datePicker <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIDatePicker alloc<span style="color: #002200;">&#93;</span> initWithFrame<span style="color: #002200;">:</span>CGRectMake<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>, <span style="color: #2400d9;">150</span>, <span style="color: #2400d9;">0</span>, <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>self.view addSubview<span style="color: #002200;">:</span>datePicker<span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>da notare che non importano le dimensioni del frame, il picker ha dimensione fissa.<br />
Vediamo quali sono le più comuni proprietà e metodi che questo oggetto ci mette a disposizione:</p>
<p><strong>maximumDate &amp; minimumDate:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> <span style="color: #400080;">NSDate</span> <span style="color: #002200;">*</span>maximumDate
<span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>nonatomic, retain<span style="color: #002200;">&#41;</span> <span style="color: #400080;">NSDate</span> <span style="color: #002200;">*</span>minimumDate</pre></div></div>

<p>permettono di limitare il range di variabilità della data impostando la data massima e la data minima selezionabile. Di default vengono impostate entrambe a nil quindi l&#8217;utente può selezionare una data arbitrariamente passata o futura.</p>
<p>esempio: (questo esempio è complicato dall&#8217;utilizzo della classe <em>nsdate</em> che vedremo un&#8217;altra volta.)</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>min <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;20042010&quot;</span>;
<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>max <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;22042010&quot;</span>;
<span style="color: #400080;">NSDateFormatter</span> <span style="color: #002200;">*</span>dateFormat <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSDateFormatter</span> alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>dateFormat setDateFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;ddMMyyyy&quot;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #400080;">NSDate</span> <span style="color: #002200;">*</span>datemin <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>dateFormat dateFromString<span style="color: #002200;">:</span>min<span style="color: #002200;">&#93;</span>;
<span style="color: #400080;">NSDate</span> <span style="color: #002200;">*</span>datemax <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>dateFormat dateFromString<span style="color: #002200;">:</span>max<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>self.view addSubview<span style="color: #002200;">:</span>datePicker<span style="color: #002200;">&#93;</span>;
datePicker.maximumDate <span style="color: #002200;">=</span> datemax;
datePicker.minimumDate <span style="color: #002200;">=</span> datemin;</pre></div></div>

<p><strong>minuteInterval:</strong></p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>nonatomic<span style="color: #002200;">&#41;</span> NSInteger minuteInterval</pre></div></div>

<p>Indica l&#8217;intervallo di selezione dei minuti, di default viene posto a 1 ma possiamo modificarlo, purché ci limitiamo ad inserire divisori di 60 (per esempio 2, 5, 30 ma non 23 oppure 45)</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">datePicker.minuteInterval <span style="color: #002200;">=</span> <span style="color: #2400d9;">30</span>;</pre></div></div>

<p><strong>setDate:animated:</strong></p>
<p>questo metodo permette di impostare una data nell&#8217; UIDatePicker a runtime, se animated è impostato a YES verrà visualizzata l&#8217;animazione delle rotelle che girano.</p>
<p><strong>datePickerMode</strong>:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>nonatomic<span style="color: #002200;">&#41;</span> UIDatePickerMode datePickerMode&lt;<span style="color: #002200;">/</span>strong&gt;</pre></div></div>

<p>Questa proprietà determina l&#8217;aspetto delll&#8217;UIDatePicker, se permette la selezione di una data, di un orario, di entrambi o un conto alla rovescia. Il valore di default è <em>UIDatePickerModeDateAndTime</em>.</p>
<p>Gli altri possibili valori sono:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">UIDatePickerModeTime
UIDatePickerModeDate
UIDatePickerModeDateAndTime
UIDatePickerModeCountDownTimer</pre></div></div>

<p><center></p>
<table border="0" align="center">
<tbody>
<tr>
<td>
<div id="attachment_3155" class="wp-caption aligncenter" style="width: 166px"><a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/04/UIDatePickerModeTime.png"><img class="size-medium wp-image-3155" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/04/UIDatePickerModeTime-156x300.png" alt="" width="156" height="300" /></a><p class="wp-caption-text">UIDatePickerModeTime</p></div>
</td>
<td>
<div id="attachment_3156" class="wp-caption aligncenter" style="width: 166px"><a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/04/UIDatePickerModeDate.png"><img class="size-medium wp-image-3156" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/04/UIDatePickerModeDate-156x300.png" alt="" width="156" height="300" /></a><p class="wp-caption-text">UIDatePickerModeDate</p></div>
</td>
</tr>
<tr>
<td>
<div id="attachment_3157" class="wp-caption aligncenter" style="width: 166px"><a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/04/UIDatePickerModeDateAndTime.png"><img class="size-medium wp-image-3157" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/04/UIDatePickerModeDateAndTime-156x300.png" alt="" width="156" height="300" /></a><p class="wp-caption-text">UIDatePickerModeDateAndTime</p></div>
</td>
<td>
<div id="attachment_3158" class="wp-caption aligncenter" style="width: 166px"><a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/04/UIDatePickerModeCountDownTimer.png"><img class="size-medium wp-image-3158" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/04/UIDatePickerModeCountDownTimer-156x300.png" alt="" width="156" height="300" /></a><p class="wp-caption-text">...ModeCountDownTimer</p></div>
</td>
</tr>
</tbody>
</table>
<p></center></p>
<p>Veniamo ora al secondo argomento di questa guida, parliamo di <strong>UIPickerView</strong>.</p>
<p>Proviamo come poc&#8217;anzi a creare un pickerview e visualizzarlo nella nostra applicazione:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">UIPickerView <span style="color: #002200;">*</span>Picker;
Picker <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIPickerView alloc<span style="color: #002200;">&#93;</span> initWithFrame<span style="color: #002200;">:</span>CGRectMake<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>, <span style="color: #2400d9;">150</span>, <span style="color: #2400d9;">0</span>, <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>self.view addSubview<span style="color: #002200;">:</span>Picker<span style="color: #002200;">&#93;</span>;
UIPickerView <span style="color: #002200;">*</span>Picker;Picker <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIPickerView alloc<span style="color: #002200;">&#93;</span> initWithFrame<span style="color: #002200;">:</span>CGRectMake<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>, <span style="color: #2400d9;">150</span>, <span style="color: #2400d9;">0</span>, <span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>self.view addSubview<span style="color: #002200;">:</span>Picker<span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>Purtroppo il codice sembra non funzionare, il picker non si vede ed al suo posto otteniamo soltato un rettangolo nero, come mai? Ci viene in aiuto la class reference che dice:</p>
<p><em> &#8220;A UIPickerView object requires the cooperation of a delegate for constructing its components and a data source for providing the numbers of components and rows.</em>&#8221;</p>
<p>Che per chi non mastica l&#8217;inglese vuol dire:</p>
<p>&#8220;Un oggetto UIPickerView richiede la cooperazione di un degate per costruire i suoi componenti e di un data source che proveda a fornire il numero dei componenti e delle righe.&#8221;</p>
<p>Quindi poichè al nostro pickerview non abbiamo specificato nè <strong>delegate</strong> nè <strong>datasource</strong>, non è in grado di visualizzare nulla, ecco quindi spiegato il rettangolo nero.</p>
<p>Concettualmente <em>delegate</em> e <em>dataprovider</em> potrebbero essere due classi separate e create appositamente per tale scopo, ma spesso viene dato il compito di assolvere a questi ruoli allo stesso File&#8217;s Owner dell&#8217;uipickerview. Per fare questo quindi scriviamo:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">&#91;</span>Picker setDelegate<span style="color: #002200;">:</span>self<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>Picker setDataSource<span style="color: #002200;">:</span>self<span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>Se provassimo adesso ad eseguire il codice vedremmo crashare inesorabilmente la nostra applicazione, ma anche a questo c&#8217;è una spiegazione&#8230; abbiamo detto al pickerview di interpellare il suo File&#8217;s Owner (self) per ricevere tutte le informazioni necessarie per la sua visualizzazione, ma non abbiamo detto al File&#8217;s Owner cosa rispondere, quindi in questo empasse l&#8217;applicazione va in crash.</p>
<p>Diamo quindi un&#8217;occhiata alla reference apple per <strong>UIPickerViewDelegate</strong> (<a href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIPickerViewDelegate_Protocol/Reference/UIPickerViewDelegate.html#//apple_ref/occ/intf/UIPickerViewDelegate" target="_blank">qui</a>)</p>
<p>scopriamo che la classe che vuol fare da delegare ad un uipickerview deve implementare almeno uno tra questi due metodi:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">– pickerView<span style="color: #002200;">:</span>titleForRow<span style="color: #002200;">:</span>forComponent<span style="color: #002200;">:</span>
– pickerView<span style="color: #002200;">:</span>viewForRow<span style="color: #002200;">:</span>forComponent<span style="color: #002200;">:</span>reusingView<span style="color: #002200;">:</span></pre></div></div>

<p>Il secondo è meno utilizzato perché si usa per visualizzare immagini all&#8217;interno del picker piuttosto che una descrizione testuale;</p>
<p>Aggiungiamo quindi alla nostra classe questo metodo:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>pickerView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIPickerView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>pickerView
			 titleForRow<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span>row
			forComponent<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span>component
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> stringWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;VALORE NUM:%d&quot;</span>,row<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>non abbiamo ancora terminato, abbiamo implementato il delegate, resta da implementare il datasource.</p>
<p>Leggiamo quindi sempre dalla reference apple (<a href="http://developer.apple.com/iphone/library/documentation/iPhone/Reference/UIPickerViewDataSource_Protocol/Reference/Reference.html#//apple_ref/occ/intf/UIPickerViewDataSource" target="_blank">qui</a>) che i metodi da implementare sono tutti e due, e sono:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span>numberOfComponentsInPickerView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIPickerView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>pickerView
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span>pickerView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIPickerView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>pickerView numberOfRowsInComponent<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span>component</pre></div></div>

<p>Il primo specifica quante &#8220;rotelle&#8221; devono essere disegnate nel picker, mentre il secondo specifica, per ogni &#8220;rotella&#8221; quanti devono essere i valori presenti. Nel nostro caso possiamo quindi aggiungere:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span>numberOfComponentsInPickerView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIPickerView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>pickerView
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">return</span> <span style="color: #2400d9;">1</span>;
<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span>pickerView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIPickerView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>pickerView numberOfRowsInComponent<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSInteger<span style="color: #002200;">&#41;</span>component
<span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">return</span> <span style="color: #2400d9;">20</span>;
<span style="color: #002200;">&#125;</span></pre></div></div>

<p>eseguiamo quindi il nostro codice e godiamoci finalmente il nostro UIpickerView!</p>
<p><center><br />
<div id="attachment_3163" class="wp-caption aligncenter" style="width: 166px"><a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/04/pickerview.png"><img class="size-medium wp-image-3163" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/04/pickerview-156x300.png" alt="" width="156" height="300" /></a><p class="wp-caption-text">PickerView</p></div><br />
</center></p>
<p>La trattazione di questi oggetti è stata particolarmente lunga e non è affatto esaustiva, invito per tanto tutti a leggere le reference apple per riuscire a sfruttare al massimo questi oggetti.</p>
<p>Un ultimo consiglio per gli amanti di interface builder, potete trascinare i picker come trascinereste qualsiasi altro oggetto, ricordatevi però di impostare nella finestra &#8220;connection&#8221; il corretto delegate e datasource (ctrl e trascina)</p>
<p><center><br />
<a href="http://www.devapp.it/wordpress/supporto-applicazioni/parole-vietate-di-ignazio-calo"><img class="aligncenter size-full wp-image-2264" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/02/bannerIgnazioc.png" alt="" width="480" height="100" /></a><br />
</center></p>
]]></content:encoded>
			<wfw:commentRss>http://www.devapp.it/wordpress/uipickerview-e-uidatepicker-guida-all-uso.html/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>UIButton &#8211; Guida completa all&#8217;uso</title>
		<link>http://www.devapp.it/wordpress/uibutton-guida-completa-alluso.html</link>
		<comments>http://www.devapp.it/wordpress/uibutton-guida-completa-alluso.html#comments</comments>
		<pubDate>Fri, 05 Mar 2010 09:00:31 +0000</pubDate>
		<dc:creator>Ignazioc</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[uibutton]]></category>
		<category><![CDATA[Xcode]]></category>

		<guid isPermaLink="false">http://www.devapp.it/wordpress/?p=2402</guid>
		<description><![CDATA[Continuiamo il nostro tour dell&#8217;UIkit framework analizzando oggi la classe UIButton. Come sempre, la guida di riferimento è la Class Reference pubblicata da Apple® che potete trovare a questo indirizzo. Analizzando la Class Reference, l&#8217;informazione principale, e non a caso Apple® la inserisce per prima, è l&#8217;albero &#8220;genealogico&#8221; della classe in questione, per esempio per]]></description>
			<content:encoded><![CDATA[<p>Continuiamo il nostro tour dell&#8217;UIkit framework analizzando oggi la classe UIButton.</p>
<p>Come sempre, la guida di riferimento è la Class Reference pubblicata da Apple® che potete trovare a <a href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIButton_Class/UIButton/UIButton.html" target="_blank">questo indirizzo</a>.</p>
<p>Analizzando la Class Reference, l&#8217;informazione principale, e non a caso Apple® la inserisce per prima, è l&#8217;albero &#8220;genealogico&#8221; della classe in questione, per esempio per la classe UIButton la reference dice:</p>
<pre>inherits from UIControl : UIView : UIResponder : NSObject</pre>
<p>quindi la gerarchia è questa:</p>
<p><center><br />
<div id="attachment_2404" class="wp-caption aligncenter" style="width: 277px"><a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/03/UIButton.png"><img class="size-full wp-image-2404" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/03/UIButton.png" alt="" width="267" height="244" /></a><p class="wp-caption-text">Gerarchia della classe UIButton</p></div><br />
</center><span id="more-2402"></span></p>
<p>Ho segnato in verde le classi che abbiamo già trattato su questo sito, in rosso la classe che trattiamo oggi.</p>
<p>Come è facile intuire, più ci spostiamo verso il basso nella gerarchia delle classi, più saranno i metodi e le proprietà utilizzabili sulla classe stessa, questo perché non solo dobbiamo considerare metodi e proprietà proprietari della classe, ma anche tutti quelli delle sue superclassi ereditati.</p>
<p>Credo che tutti sappiano trascinare un UIButton da Interface Builder, vediamo invece come aggiungerne uno alle nostre view a <em>runtime</em></p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">&#91;</span>UIButton <span style="color: #002200;">*</span> btn <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>UIButton buttonWithType<span style="color: #002200;">:</span>UIButtonTypeRoundedRect<span style="color: #002200;">&#93;</span>;btn.frame <span style="color: #002200;">=</span> CGRectMake<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>, <span style="color: #2400d9;">0</span>, <span style="color: #2400d9;">100</span>, <span style="color: #2400d9;">50</span><span style="color: #002200;">&#41;</span>;
<span style="color: #002200;">&#91;</span>btn setTitle<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Hello, world!&quot;</span> forState<span style="color: #002200;">:</span>UIControlStateNormal<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>self.view addSubview<span style="color: #002200;">:</span>btn<span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>Esaminando il codice vediamo subito un particolare costruttore che prende in input un (UIButtonType)buttonType; questo può avere 6 possibili diversi valori ed il risultato è quello che si vede in questa immagine.</p>
<p><center><br />
<div id="attachment_2407" class="wp-caption aligncenter" style="width: 322px"><a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/03/uibuttonType.png"><img class="size-full wp-image-2407" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/03/uibuttonType.png" alt="" width="312" height="256" /></a><p class="wp-caption-text">UIButtonType</p></div><br />
</center></p>
<p>Nella prima riga non c&#8217;è un errore, il pulsante non si vede perché è un rettangolo trasparente. Questo tipo di pulsante può essere comodamente usato per ottenere un pulsante personalizzato, (se si chiama &#8220;custom&#8221; ci sarà un perché) infatti basterà inserire sotto il pulsante un controllo UIImageView di dimensioni e contenuto appropriato per ottenere un pulsante con qualsiasi immagine.</p>
<p>Per i fans di Interface Builder lo stesso risultato è ottenibile selezionando la voce corrente nel menù a discesa presente in &#8220;attributes inspector&#8221;:</p>
<p><center><br />
<div id="attachment_2408" class="wp-caption aligncenter" style="width: 495px"><a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/03/UIbuttontype_IB.png"><img class="size-full wp-image-2408" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/03/UIbuttontype_IB.png" alt="UibuttonType su Interface Builder" width="485" height="197" /></a><p class="wp-caption-text">UIButtonType in interface builder</p></div><br />
</center></p>
<p>Nell&#8217;istruzione successiva ne impostiamo la dimensione e posizione tramite la funzione CGRectMake già vista nell&#8217;articolo sulle UILabel.</p>
<p>Gli oggetti della classe derivate da UIControl  possono trovarsi in diversi stati (anche più contemporaneamente). Gli stati possibili sono:</p>
<p><center></p>
<table>
<tr>
<td><strong>UIControlStateNormal</strong></td>
<td>il controllo è attivo</td>
</tr>
<tr>
<td><strong>UIControlStateHighlighted</strong></td>
<td>È lo stato &#8220;evidenziato&#8221; dei controlli. Un controllo si trova in questo stato quando viene toccato o quando viene trascinato. Possiamo verificare via codice se un controllo si trova in questo stato esaminando la sua proprietà ishighlighted</td>
</tr>
<tr>
<td><strong>UIControlStateDisabled</strong></td>
<td>Il controllo è disabilitato.</td>
</tr>
<td><strong>UIControlStateSelected</strong></td>
<td>Stato &#8220;selezionato&#8221;. per molti controlli non è disponibile.</td>
</tr>
<tr>
<td><strong>UIControlStateApplication</strong></td>
<td>Riservato per scopi interni alla nostra applicazione.</td>
</tr>
<tr>
<td><strong>UIControlStateReserved</strong></td>
<td>Riservato per scopi riservati del framework.</td>
</tr>
</table>
<p></center></p>
<p>Tutti i metodi che servono per modificare l&#8217;aspetto estetico dei controlli prendono quindi come parametro anche uno di questi valori. Sarà quindi possibile realizzare per esempio un pulsante rosso che diventa grigio quando viene disattivato e verde quando viene cliccato.</p>
<p>I metodi per modificare l&#8217;aspetto dei pulsanti sono:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>setTitle<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>title forState<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIControlState<span style="color: #002200;">&#41;</span>state
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>setTitleColor<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIColor <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>color forState<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIControlState<span style="color: #002200;">&#41;</span>state
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>setTitleShadowColor<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIColor <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>color forState<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIControlState<span style="color: #002200;">&#41;</span>state
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>setImage<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIImage <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>image forState<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIControlState<span style="color: #002200;">&#41;</span>state
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>setBackgroundImage<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIImage <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>image forState<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIControlState<span style="color: #002200;">&#41;</span>state<span style="color: #002200;">=</span><span style="color: #bf1d1a;">&quot;objc&quot;</span></pre></div></div>

<p>Per ricevere in lettura questi valori sono previsti metodi analoghi:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>titleForState<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIControlState<span style="color: #002200;">&#41;</span>state
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>UIColor <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>titleColorForState<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIControlState<span style="color: #002200;">&#41;</span>state
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>UIColor <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>titleShadowColorForState<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIControlState<span style="color: #002200;">&#41;</span>state
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>UIImage <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>imageForState<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIControlState<span style="color: #002200;">&#41;</span>state
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>UIImage <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>backgroundImageForState<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIControlState<span style="color: #002200;">&#41;</span>state</pre></div></div>

<p>Come se non bastasse sono state previste anche delle <em>proprietà</em> che quindi vengono usate con la sintassi nome_oggetto.nomeproprietà:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>nonatomic,readonly,retain<span style="color: #002200;">&#41;</span> UILabel <span style="color: #002200;">*</span>titleLabel
<span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>nonatomic, readonly, retain<span style="color: #002200;">&#41;</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>currentTitle
<span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>nonatomic, readonly, retain<span style="color: #002200;">&#41;</span> UIColor <span style="color: #002200;">*</span>currentTitleColor
<span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>nonatomic, readonly, retain<span style="color: #002200;">&#41;</span> UIColor <span style="color: #002200;">*</span>currentTitleShadowColor
<span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>nonatomic, readonly, retain<span style="color: #002200;">&#41;</span> UIImage <span style="color: #002200;">*</span>currentImage
<span style="color: #a61390;">@property</span><span style="color: #002200;">&#40;</span>nonatomic, readonly, retain<span style="color: #002200;">&#41;</span> UIImage <span style="color: #002200;">*</span>currentBackgroundImage</pre></div></div>

<p>Tutte queste personalizzazioni possono essere specificate anche tramite interface builder, ma se vogliamo modificare le proprietà di un controllo a runtime l&#8217;unica possibilità che abbiamo è quella di adoperare i metodi forniti da apple.</p>
<p><center><br />
<div id="attachment_2419" class="wp-caption aligncenter" style="width: 454px"><a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/03/UIButton_property.png"><img class="size-full wp-image-2419" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/03/UIButton_property.png" alt="" width="444" height="240" /></a><p class="wp-caption-text">Proprietà di UIButtton da interface builder</p></div><br />
</center></p>
<p>Vediamo qualche esempio di utilizzo di questi metodi:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #11740a; font-style: italic;">//Creo un oggetto UIButton di tipo TypeRoundedRect</span>
UIButton <span style="color: #002200;">*</span> btn <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>UIButton buttonWithType<span style="color: #002200;">:</span>UIButtonTypeRoundedRect<span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">//lo posiziono al centro schermo.</span>
btn.frame <span style="color: #002200;">=</span> CGRectMake<span style="color: #002200;">&#40;</span><span style="color: #2400d9;">35</span>, <span style="color: #2400d9;">215</span>, <span style="color: #2400d9;">250</span>, <span style="color: #2400d9;">50</span><span style="color: #002200;">&#41;</span>;
<span style="color: #11740a; font-style: italic;">//ne imposto ìl titolo per lo stato normale.</span>
<span style="color: #002200;">&#91;</span>btn setTitle<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;STATO: NORMALE&quot;</span> forState<span style="color: #002200;">:</span>UIControlStateNormal<span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">//ne imposto il colore del titolo per lo stato normal.</span>
<span style="color: #002200;">&#91;</span>btn setTitleColor<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>UIColor greenColor<span style="color: #002200;">&#93;</span> forState<span style="color: #002200;">:</span>UIControlStateNormal<span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">//ne imposto il titolo per lo stato &quot;cliccato&quot;</span>
<span style="color: #002200;">&#91;</span>btn setTitle<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;STATO: CLICCATO&quot;</span> forState<span style="color: #002200;">:</span>UIControlStateHighlighted<span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">//ne imposto il colore del titolo per lo stato &quot;cliccato&quot;</span>
<span style="color: #002200;">&#91;</span>btn setTitleColor<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>UIColor redColor<span style="color: #002200;">&#93;</span> forState<span style="color: #002200;">:</span>UIControlStateHighlighted<span style="color: #002200;">&#93;</span>;
<span style="color: #11740a; font-style: italic;">//accedo alla proprietà currentTitle</span>
NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;IN QUESTO MOMENTO HA TITOLO: %@&quot;</span>, btn.currentTitle<span style="color: #002200;">&#41;</span>;
<span style="color: #11740a; font-style: italic;">//accedo al valore del titolo allo stato &quot;cliccato.&quot;</span>
NSLog<span style="color: #002200;">&#40;</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;NELLO STATO ATTIVO HA TITOLO: %@&quot;</span>,<span style="color: #002200;">&#91;</span>btn titleForState<span style="color: #002200;">:</span>UIControlStateHighlighted<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#41;</span>;</pre></div></div>

<p>Prima di concludere vediamo due ultime &#8220;chicche&#8221;: la prima è la proprietà <strong>showsTouchWhenHighlighted</strong>, che determina se il pulsante deve illuminarsi quando viene cliccato. Basta quindi scrivere <strong>btn.showsTouchWhenHighlighted = YES</strong> un&#8217;ottima animazione sui nostri pulsanti.<br />
Con la seconda ed ultima chicca vediamo la possibilità di assegnare, sempre a runtime, una funzione ad un determinato evento sul controllo (per i più smaliziati..una sorta di binding dinamico).</p>
<p>Il metodo è il seguente:</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>addTarget<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>target action<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">SEL</span><span style="color: #002200;">&#41;</span>action forControlEvents<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIControlEvents<span style="color: #002200;">&#41;</span>controlEvents</pre></div></div>

<p>&#8220;target&#8221; è l&#8217;oggetto che deve rispondere all&#8217;evento..di solito si utilizza &#8220;self&#8221;</p>
<p>&#8220;action&#8221; è un selector, ne parleremo magari più avanti, per il momento basti dire che è il nome di un metodo dichiarato nella nostra classe.</p>
<p>&#8220;controlEvents&#8221; è l&#8217;evento che che deve essere riconosciuto.</p>
<p>nel nostro caso potremmo quindi scrivere</p>

<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">&#91;</span>btn addTarget<span style="color: #002200;">:</span>self action<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>aMethod<span style="color: #002200;">:</span><span style="color: #002200;">&#41;</span> forControlEvents<span style="color: #002200;">:</span>UIControlEventTouchDown<span style="color: #002200;">&#93;</span>;</pre></div></div>

<p>@lla prossima <img src='http://www.devapp.it/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><center><br />
<a href="http://www.devapp.it/wordpress/supporto-applicazioni/parole-vietate-di-ignazio-calo"><img class="aligncenter size-full wp-image-2422" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/03/bannerIgnazioc.png" alt="" width="480" height="100" /></a><br />
</center></p>
]]></content:encoded>
			<wfw:commentRss>http://www.devapp.it/wordpress/uibutton-guida-completa-alluso.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>UILabel &#8211; Guida completa all&#8217;uso.</title>
		<link>http://www.devapp.it/wordpress/uilabel-guida-completa-alluso.html</link>
		<comments>http://www.devapp.it/wordpress/uilabel-guida-completa-alluso.html#comments</comments>
		<pubDate>Fri, 26 Feb 2010 10:47:17 +0000</pubDate>
		<dc:creator>Ignazioc</dc:creator>
				<category><![CDATA[Framework]]></category>
		<category><![CDATA[tutorial]]></category>
		<category><![CDATA[uikit]]></category>
		<category><![CDATA[UILabel]]></category>
		<category><![CDATA[Xcode]]></category>

		<guid isPermaLink="false">http://www.devapp.it/wordpress/?p=2230</guid>
		<description><![CDATA[Tutti i tutorial per lo svillupo su iphone iniziano con &#8220;aprite interface builder e trascinate una UILabel..&#8221; ma cosa sono in realtà le UILabel? Le UILabel fanno parte della gerarchia dell&#8217;UIKit framework che la Apple ci mette a disposizione. Come possiamo vedere in questa immagine, ereditano direttamente da UIView che a loro volta ereditano da]]></description>
			<content:encoded><![CDATA[<p>Tutti i tutorial per lo svillupo su iphone iniziano con &#8220;aprite interface builder e trascinate una UILabel..&#8221; ma cosa sono in realtà le UILabel? Le UILabel fanno parte della gerarchia dell&#8217;UIKit framework che la Apple ci mette a disposizione.</p>
<p><center><br />
<div id="attachment_2232" class="wp-caption aligncenter" style="width: 310px"><a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/02/Gerarchia-UILabel-.png"><img class="size-medium wp-image-2232" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/02/Gerarchia-UILabel--300x178.png" alt="Gerarchia UILabel" width="300" height="178" /></a><p class="wp-caption-text">UILabel nel UIKit framework</p></div><br />
</center><span id="more-2230"></span></p>
<p>Come possiamo vedere in questa immagine, ereditano direttamente da UIView che a loro volta ereditano da UIResponder e da NSObject. Capire a quale livello della gerarchia è posizionata la classe che stiamo analizzando è indispensabile per capire subito quali sono i metodi e proprietà che possiamo utilizzare.</p>
<p>In realtà se utilizzassimo le label esclusivamente trascinandole da interface builder potremmo ignorare tutto questo, ma poichè noi sviluppatori non viviamo bene senza righe di codice, vediamo in dettagli come creare ed impostare una label a <em>runtime</em>.</p>
<p>La prima cosa da fare sarà dichiarare un oggetto di tipo UILabel, allocarlo ed inizializzarne il valore, tutto questo viene fatto con queste istruzioni:</p>
<pre lang="objc" line="yes" escaped="true">
UILabel *newLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 30, 200, 100)];
</pre>
<p>Il metodo &#8220;alloc&#8221; è ereditato dalla classe NSObject e si occupa semplicemente di riservare nella memoria sufficiente spazio per allocare un oggetto di tipo UILabel, mentre il metodo &#8220;initWithFrame&#8221; è un metodo della classe UIView che inizializza e ritorna un nuovo oggetto di tipo UIView delle dimensioni e nella posizione specificata dal parametro.</p>
<p>Qualcuno si sta chiedendo &#8220;Ma noi serve una UILabel..se <em>initiWithFrame</em> restituisce una UIView che me ne faccio??&#8221;&#8230;io potrei rispondere con un altra domanda &#8220;se <em>alloc</em> restituisce un NSObject come mai lo utilizziamo con qualsiasi oggetto??&#8221;&#8230;la risposta è che è proprio questo il bello della programmazione ad oggetti, la UILabel è una sottoclasse di UIView quindi <strong>è</strong> una UIView&#8230;e possiamo utilizzarla come e dove è previsto l&#8217;utilizzo di una UIView. Questo è da tenere bene a mente perché è un pilastro importante della programmazione ad oggetti.</p>
<p>CGRectMake(x,y,width,height) fa parte di un altro framework, il quarz2d, e al momento sorvoliamo sul suo utlizzo, quello che ci serve sapere è che restituisce un rettangolo (CGRect) il cui angolo superiore sinistro è posizionato nel punto di coordinate x,y e che ha una larghezza pari a <em>width</em> pixel ed un&#8217;altezza di <em>height</em> pixel. (Trovate <a href="http://www.devapp.it/wordpress/t013-disegnamo-una-vista-da-codice.html" target="_blank">qui</a> su devAPP un tutorial fatto veramente bene)</p>
<p>Una volta dichiarata, allocata ed inizializzata la nostra UILabel non resta che visulizzarla, richiamiamo quindi il metodo addSubView sulla vista che dovrà contenerla. (addSubView come parametro vuole una UIView..a questo punto dovrebbe essere chiaro perchè possiamo passargli una UILabel..)</p>
<pre lang="objc" line="yes" escaped="true">[self.view addSubview:newLabel];</pre>
<p>Vediamo ora una serie di proprietà che possono essere impostate per modificare l&#8217;aspetto della UILabel:</p>
<p>Una piccola nota, poiché sono dichiarate come proprietà possiamo accedervi in lettura e scrittura tramite l&#8217;operatore &#8220;.&#8221; (punto) non è necessario utilizzare metodi <em>set</em> e <em>get</em>.</p>
<table border="0">
<tbody>
<tr>
<td><strong>NOME</strong></td>
<td><strong>DESCRIZIONE</strong></td>
<td><strong>ESEMPIO</strong></td>
</tr>
<tr>
<td>text</td>
<td>Imposta la stringa di testo visulizzata nella UILabel</td>
<td>
<pre>myLabel.text = @"Ciao mondo"</pre>
</td>
</tr>
<tr>
<td>font</td>
<td>Imposta il font</td>
<td>
<pre>myLabel.font = [UIFont boldSystemFontOfSize:25];</pre>
</td>
</tr>
<tr>
<td>textColor</td>
<td>Imposta il colore del testo</td>
<td>
<pre>myLabel.textColor = [UIColor blueColor];</pre>
</td>
</tr>
<tr>
<td>textAlignment</td>
<td>Imposta l&#8217;allineamento del testo</td>
<td>
<pre>myLabel.textAlignment = UITextAlignmentCenter;</pre>
</td>
</tr>
<tr>
<td>enabled</td>
<td>Specifica se la UILabel è abilitata o meno. Attenzione:<br />
il <em>getter</em> per questa proprietà è &#8220;isEnabled&#8221;.</td>
<td>
<pre>myLabel.enabled = FALSE;
myboolValue = [mylabel isEnabled];</pre>
</td>
</tr>
</tbody>
</table>
<p>Per le altre proprietà vi rimando alla UILabel class reference ufficiale apple che trovate a questo indirizzo:</p>
<p><a href="http://developer.apple.com/iphone/prerelease/library/documentation/UIKit/Reference/UILabel_Class/UILabel_Class.pdf" target="_blank">http://developer.apple.com/iphone/prerelease/library/documentation/UIKit/Reference/UILabel_Class/UILabel_Class.pdf</a></p>
<p><center><br />
<a href="http://www.devapp.it/wordpress/supporto-applicazioni/parole-vietate-di-ignazio-calo"><img class="aligncenter size-full wp-image-2264" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/02/bannerIgnazioc.png" alt="" width="480" height="100" /></a><br />
</center></p>
]]></content:encoded>
			<wfw:commentRss>http://www.devapp.it/wordpress/uilabel-guida-completa-alluso.html/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
	</channel>
</rss>
