<?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; </title>
	<atom:link href="http://www.devapp.it/wordpress/feed" rel="self" type="application/rss+xml" />
	<link>http://www.devapp.it/wordpress</link>
	<description>Impara a programmare il tuo iPhone</description>
	<lastBuildDate>Fri, 30 Jul 2010 08:28:31 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>T#067 &#8211; Caricare immagini nelle tabelle in modalità asincrona</title>
		<link>http://www.devapp.it/wordpress/t067-caricare-immagini-nelle-tabelle-in-modalita-asincrona.html</link>
		<comments>http://www.devapp.it/wordpress/t067-caricare-immagini-nelle-tabelle-in-modalita-asincrona.html#comments</comments>
		<pubDate>Fri, 30 Jul 2010 08:28:31 +0000</pubDate>
		<dc:creator>sarnieri</dc:creator>
				<category><![CDATA[Tutorial Pratici]]></category>
		<category><![CDATA[asincrono]]></category>
		<category><![CDATA[async]]></category>
		<category><![CDATA[caricare immagini iphone]]></category>
		<category><![CDATA[download asincrono iphone]]></category>
		<category><![CDATA[immagini]]></category>
		<category><![CDATA[table]]></category>

		<guid isPermaLink="false">http://www.devapp.it/wordpress/?p=4187</guid>
		<description><![CDATA[Oggi vorrei proporvi la risoluzione di un annoso problema riguardante il caricamento asyncrono di immagini all’interno delle tabelle.

Come sicuramente saprete, é relativamente semplice in xcode visualizzare un’immagine prendendo il link direttamente via HTTP, ma il caricamente delle righe delle table richiede che vengano scaricate le immagini che visualizziamo PRIMA di visualizzare la riga stessa.]]></description>
			<content:encoded><![CDATA[<p>Salve a tutti, dopo una lunghissima pausa torno a scrivere qualche mini tutorial, spero abbiate seguito i miei articoli su piattaforma Bada nel frattempo! Oggi vorrei proporvi la risoluzione di un annoso problema riguardante il caricamento asyncrono di immagini all’interno delle tabelle.</p>
<p>Come sicuramente saprete, è relativamente semplice in Xcode visualizzare un&#8217;immagine prendendo il link direttamente via HTTP, ma il caricamente delle righe delle table richiede che vengano scaricate le immagini che visualizziamo PRIMA di visualizzare la riga stessa. L’obiettivo che volevo raggiungere era lo stesso che potete vedere sfogliando l’applicazione ‘App Store’ nella sezione categoria su iPhone/iPod/iPad… in cui se ci fate caso, vedrete apparire immediatamente i testi e poco dopo le 5 icone che vengono scaricate in background asincronicamente (gran parola!).<span id="more-4187"></span></p>
<p>Innanzitutto creaiamo la classe &#8220;AsyncImageView&#8221; che richiameremo dal nosto metodo &#8220;cellForRowAtIndexPath&#8221;.</p>
<p>Di seguito il file AsyncImageView.h</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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &quot;AsyncImageView.h&quot;</span>
&nbsp;
<span style="color: #a61390;">@implementation</span> AsyncImageView
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>dealloc <span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>connection cancel<span style="color: #002200;">&#93;</span>; <span style="color: #11740a; font-style: italic;">//in case the URL is still downloading</span>
	<span style="color: #002200;">&#91;</span>connection release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>data release<span style="color: #002200;">&#93;</span>; 
    <span style="color: #002200;">&#91;</span>super dealloc<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>loadImageFromURL<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSURL</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>url <span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>connection<span style="color: #002200;">!=</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span> <span style="color: #002200;">&#91;</span>connection release<span style="color: #002200;">&#93;</span>; <span style="color: #002200;">&#125;</span> <span style="color: #11740a; font-style: italic;">//in case we are downloading a 2nd image</span>
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>data<span style="color: #002200;">!=</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span> <span style="color: #002200;">&#91;</span>data release<span style="color: #002200;">&#93;</span>; <span style="color: #002200;">&#125;</span>
&nbsp;
	<span style="color: #400080;">NSURLRequest</span><span style="color: #002200;">*</span> request <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSURLRequest</span> requestWithURL<span style="color: #002200;">:</span>url cachePolicy<span style="color: #002200;">:</span>NSURLRequestUseProtocolCachePolicy timeoutInterval<span style="color: #002200;">:</span><span style="color: #2400d9;">60.0</span><span style="color: #002200;">&#93;</span>;
	connection <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSURLConnection</span> alloc<span style="color: #002200;">&#93;</span> initWithRequest<span style="color: #002200;">:</span>request delegate<span style="color: #002200;">:</span>self<span style="color: #002200;">&#93;</span>; <span style="color: #11740a; font-style: italic;">//notice how delegate set to self object</span>
<span style="color: #002200;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #11740a; font-style: italic;">//the URL connection calls this repeatedly as data arrives</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>connection<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSURLConnection</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>theConnection didReceiveData<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>incrementalData <span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>data<span style="color: #002200;">==</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span> data <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableData</span> alloc<span style="color: #002200;">&#93;</span> initWithCapacity<span style="color: #002200;">:</span><span style="color: #2400d9;">2048</span><span style="color: #002200;">&#93;</span>; <span style="color: #002200;">&#125;</span> 
	<span style="color: #002200;">&#91;</span>data appendData<span style="color: #002200;">:</span>incrementalData<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">//the URL connection calls this once all the data has downloaded</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>connectionDidFinishLoading<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSURLConnection</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>theConnection <span style="color: #002200;">&#123;</span>
	<span style="color: #11740a; font-style: italic;">//so self data now has the complete image </span>
	<span style="color: #002200;">&#91;</span>connection release<span style="color: #002200;">&#93;</span>;
	connection<span style="color: #002200;">=</span><span style="color: #a61390;">nil</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 subviews<span style="color: #002200;">&#93;</span> count<span style="color: #002200;">&#93;</span>&gt;<span style="color: #2400d9;">0</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><span style="color: #002200;">&#91;</span>self subviews<span style="color: #002200;">&#93;</span> objectAtIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span> removeFromSuperview<span style="color: #002200;">&#93;</span>; <span style="color: #11740a; font-style: italic;">//so remove it (releases it also)</span>
	<span style="color: #002200;">&#125;</span>
&nbsp;
	<span style="color: #11740a; font-style: italic;">//make an image view for the image</span>
	UIImageView<span style="color: #002200;">*</span> imageView <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIImageView alloc<span style="color: #002200;">&#93;</span> initWithImage<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>UIImage imageWithData<span style="color: #002200;">:</span>data<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;
&nbsp;
	imageView.contentMode <span style="color: #002200;">=</span> UIViewContentModeScaleAspectFit;
	imageView.autoresizingMask <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span> UIViewAutoresizingFlexibleWidth || UIViewAutoresizingFlexibleHeight <span style="color: #002200;">&#41;</span>;
	<span style="color: #002200;">&#91;</span>self addSubview<span style="color: #002200;">:</span>imageView<span style="color: #002200;">&#93;</span>;
	imageView.frame <span style="color: #002200;">=</span> self.bounds;
	<span style="color: #002200;">&#91;</span>imageView setNeedsLayout<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>self setNeedsLayout<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #002200;">&#91;</span>data release<span style="color: #002200;">&#93;</span>; <span style="color: #11740a; font-style: italic;">//don't need this any more, its in the UIImageView now</span>
	data<span style="color: #002200;">=</span><span style="color: #a61390;">nil</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">//just in case you want to get the image directly, here it is in subviews</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>UIImage<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> image <span style="color: #002200;">&#123;</span>
	UIImageView<span style="color: #002200;">*</span> iv <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>self subviews<span style="color: #002200;">&#93;</span> objectAtIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>iv image<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></td></tr></table></div>

<p>Ed il relativo file di implementazione:</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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #6e371a;">#import &quot;AsyncImageView.h&quot;</span>
&nbsp;
&nbsp;
<span style="color: #a61390;">@implementation</span> AsyncImageView
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>dealloc <span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>connection cancel<span style="color: #002200;">&#93;</span>; <span style="color: #11740a; font-style: italic;">//in case the URL is still downloading</span>
	<span style="color: #002200;">&#91;</span>connection release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>data release<span style="color: #002200;">&#93;</span>; 
    <span style="color: #002200;">&#91;</span>super dealloc<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>loadImageFromURL<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSURL</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>url <span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>connection<span style="color: #002200;">!=</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span> <span style="color: #002200;">&#91;</span>connection release<span style="color: #002200;">&#93;</span>; <span style="color: #002200;">&#125;</span> <span style="color: #11740a; font-style: italic;">//in case we are downloading a 2nd image</span>
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>data<span style="color: #002200;">!=</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span> <span style="color: #002200;">&#91;</span>data release<span style="color: #002200;">&#93;</span>; <span style="color: #002200;">&#125;</span>
&nbsp;
	<span style="color: #400080;">NSURLRequest</span><span style="color: #002200;">*</span> request <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSURLRequest</span> requestWithURL<span style="color: #002200;">:</span>url cachePolicy<span style="color: #002200;">:</span>NSURLRequestUseProtocolCachePolicy timeoutInterval<span style="color: #002200;">:</span><span style="color: #2400d9;">60.0</span><span style="color: #002200;">&#93;</span>;
	connection <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSURLConnection</span> alloc<span style="color: #002200;">&#93;</span> initWithRequest<span style="color: #002200;">:</span>request delegate<span style="color: #002200;">:</span>self<span style="color: #002200;">&#93;</span>; <span style="color: #11740a; font-style: italic;">//notice how delegate set to self object</span>
<span style="color: #002200;">&#125;</span>
&nbsp;
&nbsp;
<span style="color: #11740a; font-style: italic;">//the URL connection calls this repeatedly as data arrives</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>connection<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSURLConnection</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>theConnection didReceiveData<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>incrementalData <span style="color: #002200;">&#123;</span>
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>data<span style="color: #002200;">==</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span> data <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSMutableData</span> alloc<span style="color: #002200;">&#93;</span> initWithCapacity<span style="color: #002200;">:</span><span style="color: #2400d9;">2048</span><span style="color: #002200;">&#93;</span>; <span style="color: #002200;">&#125;</span> 
	<span style="color: #002200;">&#91;</span>data appendData<span style="color: #002200;">:</span>incrementalData<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #11740a; font-style: italic;">//the URL connection calls this once all the data has downloaded</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>connectionDidFinishLoading<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSURLConnection</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>theConnection <span style="color: #002200;">&#123;</span>
	<span style="color: #11740a; font-style: italic;">//so self data now has the complete image </span>
	<span style="color: #002200;">&#91;</span>connection release<span style="color: #002200;">&#93;</span>;
	connection<span style="color: #002200;">=</span><span style="color: #a61390;">nil</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 subviews<span style="color: #002200;">&#93;</span> count<span style="color: #002200;">&#93;</span>&gt;<span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
		<span style="color: #11740a; font-style: italic;">//then this must be another image, the old one is still in subviews</span>
		<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>self subviews<span style="color: #002200;">&#93;</span> objectAtIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span> removeFromSuperview<span style="color: #002200;">&#93;</span>; <span style="color: #11740a; font-style: italic;">//so remove it (releases it also)</span>
	<span style="color: #002200;">&#125;</span>
&nbsp;
	<span style="color: #11740a; font-style: italic;">//make an image view for the image</span>
	UIImageView<span style="color: #002200;">*</span> imageView <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIImageView alloc<span style="color: #002200;">&#93;</span> initWithImage<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>UIImage imageWithData<span style="color: #002200;">:</span>data<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;
	<span style="color: #11740a; font-style: italic;">//make sizing choices based on your needs, experiment with these. maybe not all the calls below are needed.</span>
	imageView.contentMode <span style="color: #002200;">=</span> UIViewContentModeScaleAspectFit;
	imageView.autoresizingMask <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span> UIViewAutoresizingFlexibleWidth || UIViewAutoresizingFlexibleHeight <span style="color: #002200;">&#41;</span>;
	<span style="color: #002200;">&#91;</span>self addSubview<span style="color: #002200;">:</span>imageView<span style="color: #002200;">&#93;</span>;
	imageView.frame <span style="color: #002200;">=</span> self.bounds;
	<span style="color: #002200;">&#91;</span>imageView setNeedsLayout<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>self setNeedsLayout<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #002200;">&#91;</span>data release<span style="color: #002200;">&#93;</span>; <span style="color: #11740a; font-style: italic;">//don't need this any more, its in the UIImageView now</span>
	data<span style="color: #002200;">=</span><span style="color: #a61390;">nil</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>UIImage<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> image <span style="color: #002200;">&#123;</span>
	UIImageView<span style="color: #002200;">*</span> iv <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>self subviews<span style="color: #002200;">&#93;</span> objectAtIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">return</span> <span style="color: #002200;">&#91;</span>iv image<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #a61390;">@end</span></pre></td></tr></table></div>

<p>Una volta che abbiamo la classe pronta, basterà copiarla dentro a qualsiasi progetto per poterla utilizzare, vediamo come.</p>
<p>Vi riporto per completezza tutto il metodo &#8220;cellForRowAtIndexPath&#8221;, che come saprete si occupa di valorizzare la riga che stiamo caricando in quel momento.</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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span>UITableViewCell <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>tableView<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITableView <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>tableView
		 cellForRowAtIndexPath<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSIndexPath</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>indexPath <span style="color: #002200;">&#123;</span>
&nbsp;
    <span style="color: #a61390;">static</span> <span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>CellIdentifier <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;ImageCell&quot;</span>;
    UITableViewCell <span style="color: #002200;">*</span>cell <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>tableView dequeueReusableCellWithIdentifier<span style="color: #002200;">:</span>CellIdentifier<span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>cell <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</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><span style="color: #400080;">NSBundle</span> mainBundle<span style="color: #002200;">&#93;</span> loadNibNamed<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;CellaRiepilogo&quot;</span>  owner<span style="color: #002200;">:</span>self options<span style="color: #002200;">:</span><span style="color: #a61390;">NULL</span><span style="color: #002200;">&#93;</span>;
		cell <span style="color: #002200;">=</span> nibLoadedCell;
&nbsp;
    <span style="color: #002200;">&#125;</span> <span style="color: #a61390;">else</span> <span style="color: #002200;">&#123;</span>
		AsyncImageView<span style="color: #002200;">*</span> oldImage <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span>AsyncImageView<span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>
		<span style="color: #002200;">&#91;</span>cell.contentView viewWithTag<span style="color: #002200;">:</span><span style="color: #2400d9;">999</span><span style="color: #002200;">&#93;</span>;
		<span style="color: #002200;">&#91;</span>oldImage removeFromSuperview<span style="color: #002200;">&#93;</span>;
    <span style="color: #002200;">&#125;</span>
&nbsp;
	CGRect frame;
	frame.size.width<span style="color: #002200;">=</span><span style="color: #2400d9;">47</span>; frame.size.height<span style="color: #002200;">=</span><span style="color: #2400d9;">47</span>;
	frame.origin.x<span style="color: #002200;">=</span><span style="color: #2400d9;">8</span>; frame.origin.y<span style="color: #002200;">=</span><span style="color: #2400d9;">8</span>;
	AsyncImageView<span style="color: #002200;">*</span> asyncImage <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>AsyncImageView alloc<span style="color: #002200;">&#93;</span>
								   initWithFrame<span style="color: #002200;">:</span>frame<span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;
	UIImage <span style="color: #002200;">*</span>myImage <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>UIImage imageNamed<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;blackaccessorybutton.png&quot;</span><span style="color: #002200;">&#93;</span>;
	UIImageView <span style="color: #002200;">*</span>imageView <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIImageView alloc<span style="color: #002200;">&#93;</span> initWithImage<span style="color: #002200;">:</span>myImage<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>cell setAccessoryView<span style="color: #002200;">:</span>imageView<span style="color: #002200;">&#93;</span>;
&nbsp;
&nbsp;
	Sciopero <span style="color: #002200;">*</span>sciopero <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>dati objectAtIndex<span style="color: #002200;">:</span>indexPath.row<span style="color: #002200;">&#93;</span>;
&nbsp;
	UILabel		<span style="color: #002200;">*</span>dataLabel	<span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span>UILabel <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#91;</span>cell viewWithTag<span style="color: #002200;">:</span><span style="color: #2400d9;">1</span><span style="color: #002200;">&#93;</span>;
	UILabel		<span style="color: #002200;">*</span>settoreLabel<span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span>UILabel <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#91;</span>cell viewWithTag<span style="color: #002200;">:</span><span style="color: #2400d9;">2</span><span style="color: #002200;">&#93;</span>;
	UILabel		<span style="color: #002200;">*</span>modalitaLabel<span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span>UILabel <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#91;</span>cell viewWithTag<span style="color: #002200;">:</span><span style="color: #2400d9;">3</span><span style="color: #002200;">&#93;</span>;
	UILabel		<span style="color: #002200;">*</span>descrizioneLabel<span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span>UILabel <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#91;</span>cell viewWithTag<span style="color: #002200;">:</span><span style="color: #2400d9;">4</span><span style="color: #002200;">&#93;</span>;
&nbsp;
&nbsp;
	dataLabel.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;%@&quot;</span>, <span style="color: #002200;">&#91;</span>sciopero.data uppercaseString<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
	settoreLabel.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;%@&quot;</span>, sciopero.settore<span style="color: #002200;">&#93;</span>;
	modalitaLabel.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;%@&quot;</span>, <span style="color: #002200;">&#91;</span>sciopero.modalita lowercaseString<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
	descrizioneLabel.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;%@&quot;</span>, <span style="color: #002200;">&#91;</span>sciopero.descrizione lowercaseString<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
&nbsp;
	asyncImage.tag <span style="color: #002200;">=</span> <span style="color: #2400d9;">999</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> sciopero.icona<span style="color: #002200;">&#93;</span>;	
	<span style="color: #11740a; font-style: italic;">//UIImage *img = [UIImage imageWithData:[NSData dataWithContentsOfURL:url]];</span>
	<span style="color: #11740a; font-style: italic;">//categoria.immagine  = img;</span>
&nbsp;
	<span style="color: #002200;">&#91;</span>asyncImage loadImageFromURL<span style="color: #002200;">:</span>url<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #002200;">&#91;</span>cell.contentView addSubview<span style="color: #002200;">:</span>asyncImage<span style="color: #002200;">&#93;</span>;
&nbsp;
    <span style="color: #a61390;">return</span> cell;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Nel mio caso utilizzo una cella personalizzata con uno XIB associato di nome &#8220;CellaRiepilogo.xib&#8221;.</p>
<p>La parte da personalizzare a seconda dei casi è la seguente:</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;">CGRect frame;
	frame.size.width<span style="color: #002200;">=</span><span style="color: #2400d9;">47</span>; frame.size.height<span style="color: #002200;">=</span><span style="color: #2400d9;">47</span>;
	frame.origin.x<span style="color: #002200;">=</span><span style="color: #2400d9;">8</span>; frame.origin.y<span style="color: #002200;">=</span><span style="color: #2400d9;">8</span>;
	AsyncImageView<span style="color: #002200;">*</span> asyncImage <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>AsyncImageView alloc<span style="color: #002200;">&#93;</span>
					initWithFrame<span style="color: #002200;">:</span>frame<span style="color: #002200;">&#93;</span> autorelease<span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

<p>Ossia, creiamo il frame delle dimensioni che ci interessano (nel mio caso 47×47) e decidiamo dove farlo apparire (in questo caso coordinate x=8 e y=8).</p>
<p>Successivamente:</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;">asyncImage.tag <span style="color: #002200;">=</span> <span style="color: #2400d9;">999</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> sciopero.icona<span style="color: #002200;">&#93;</span>;	
	<span style="color: #002200;">&#91;</span>asyncImage loadImageFromURL<span style="color: #002200;">:</span>url<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>cell.contentView addSubview<span style="color: #002200;">:</span>asyncImage<span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

<p>E il gioco é fatto!</p>
<p>Ricordatevi di mettere l&#8217;import:</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 &quot;AsyncImageView.h&quot;</span></pre></td></tr></table></div>

<p>Non ho scritto io quella classe, e purtroppo non ricordo dove l&#8217;ho pescata, peró ne ho trovate diverse , e questa l’ho personalizzata in diverse parti.</p>
<p>Questo stesso codice l’ho usato giá in parecchie applicazioni:</p>
<ul>
<ol>iQuimall, mi serviva per caricare le cover/skin degli iphone via web</ol>
<ol>iScioperi Trasporti – dovevo caricare tutti i dati comprensive di immagini da un mio XML su web<br />
(questo spezzone di codice viene proprio da lí!)</ol>
<ol>Tutte le altre mie app, che hanno nel tab bar l’opzione &#8220;Altre App&#8221; appare la lista completa delle<br />
applicazioni da me realizzate, e cliccando sulla riga si va direttamente sull’AppStore per l’acquisto!</ol>
</ul>
<p>Spero vi sia utile!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.devapp.it/wordpress/t067-caricare-immagini-nelle-tabelle-in-modalita-asincrona.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>T#066 &#8211; Implementiamo le Local Notification nelle nostre applicazioni iPhone</title>
		<link>http://www.devapp.it/wordpress/t066-implementiamo-le-local-notification-nelle-nostre-applicazioni-iphone.html</link>
		<comments>http://www.devapp.it/wordpress/t066-implementiamo-le-local-notification-nelle-nostre-applicazioni-iphone.html#comments</comments>
		<pubDate>Thu, 29 Jul 2010 07:47:18 +0000</pubDate>
		<dc:creator>Staff devAPP</dc:creator>
				<category><![CDATA[Tutorial Pratici]]></category>
		<category><![CDATA[ios 4]]></category>
		<category><![CDATA[local notification]]></category>
		<category><![CDATA[notifiche locali iphone]]></category>
		<category><![CDATA[Rudy Trematerra]]></category>
		<category><![CDATA[UILocalNotification]]></category>

		<guid isPermaLink="false">http://www.devapp.it/wordpress/?p=4202</guid>
		<description><![CDATA[Ciao a tutti, sono Rudy Trematerra, questo è il mio primo articolo su devAPP.it ed ho scelto di parlarvi delle &#8220;Local Notification&#8220;, una delle novità più interessanti dell&#8217;iOS 4. Le Local Notification costituiscono uno strumento molto potente per gli sviluppatori, al pari delle Push Notification, dal momento che consentono di &#8220;avvisare&#8221; l’utente con un messaggio.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/iphone-os4-local-notification.png"><img src="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/iphone-os4-local-notification.png" alt="iphone os4 local notification" title="iphone-os4-local-notification" width="150" height="103" class="alignleft size-full wp-image-4206" /></a> Ciao a tutti, sono Rudy Trematerra, questo è il mio primo articolo su devAPP.it ed ho scelto di parlarvi delle &#8220;<strong>Local Notification</strong>&#8220;, una delle novità più interessanti dell&#8217;iOS 4.<br />
Le Local Notification costituiscono uno strumento molto potente per gli sviluppatori, al pari delle <em>Push Notification</em>, dal momento che consentono di &#8220;avvisare&#8221; l’utente con un messaggio. La differenza sostanziale tra le due sta nella modalità di ricezione delle notifiche da parte dell’iOS; infatti, le push notification per poter funzionare richiedono un servizio attivo sul sistema operativo (che consuma batteria), la connessione ad internet attiva e un server che effettua il “push” delle notifiche. Le Local notification invece, richiedono solo di &#8220;conoscere&#8221; a priori il messaggio e l&#8217;orario di visualizzazione e non necessitano di una connessione ad internet: si occuperà l&#8217;iOS di visualizzare il messaggio se la nostra applicazione non è avviata, oppure di inviare una notifica alla stessa se è aperta.<span id="more-4202"></span></p>
<p>Possiamo impostare le local notification per visualizzare un messaggio, riprodurre un suono o impostare un badge all&#8217;icona dell&#8217;applicazione.</p>
<p>Nella mia applicazione, ad esempio, ho la necessità di &#8220;avvisare&#8221; l&#8217;utente di determinate scadenze (note a priori) e le <em>Local Notification</em> costituiscono lo strumento adatto per facilità d&#8217;uso sia del programmatore sia dell&#8217;utilizzatore.</p>
<h4>Il nostro progetto</h4>
<p>Per fare un semplice test, creeremo un&#8217;applicazione che all&#8217;avvio verifica se è stata &#8220;aperta&#8221; da una local notification ed in uscita crea una local notification.</p>
<p>Creiamo una &#8220;Window-based application&#8221; che chiameremo TestNotificheLocali.</p>
<p>Nel file &#8220;TestNotificheLocaliAppDelegate.h&#8221; aggiungiamo questi 2 metodi che utilizzeremo successivamente:</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: #11740a; font-style: italic;">//Metodo per impostare le notifiche locali</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>impostaLocalNotification<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSDate</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>dataNotifica ConNome<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>nome;
<span style="color: #11740a; font-style: italic;">//metodo per visualizzare un’ alertView</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span> visualizzaMessaggio<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>message titolo<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>titoloFinestra;</pre></td></tr></table></div>

<p>Nel file &#8220;TestNotificheLocaliAppDelegate.m&#8221; aggiungiamo una costante che utilizzeremo per recuperare informazioni dalla local notification.</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: #a61390;">@implementation</span> TestNotificheLocaliAppDelegate
&nbsp;
<span style="color: #a61390;">@synthesize</span> window;
<span style="color: #a61390;">@synthesize</span> viewController;
&nbsp;
<span style="color: #6e371a;">#define chiaveNome @&quot;chiaveNomeDictionary&quot;</span></pre></td></tr></table></div>

<p>Impostiamo all’avvio dell’applicazione un controllo per intercettare un’eventuale apertura dell’applicazione da parte di una notifica locale.</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><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>application<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIApplication <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>application didFinishLaunchingWithOptions<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>launchOptions <span style="color: #002200;">&#123;</span>    
&nbsp;
	<span style="color: #11740a; font-style: italic;">//Richiediamo una istanza di UILocalNotification dal dictionary delle opzioni di avvio (se ci sono). Il contenuto sarà vuoto se richiamiamo direttamente l'applicazione</span>
	UILocalNotification <span style="color: #002200;">*</span>notifica <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>launchOptions objectForKey<span style="color: #002200;">:</span> UIApplicationLaunchOptionsLocalNotificationKey<span style="color: #002200;">&#93;</span>; 
&nbsp;
	<span style="color: #11740a; font-style: italic;">//Verifichiamo se l'istanza è vuota (ad esempio abbiamo richiamato direttamente l'applicazione)</span>
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>notifica<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span>
		<span style="color: #11740a; font-style: italic;">//Questo significa che l'applicazione si è avviata da un messaggio di notifica locale!</span>
&nbsp;
		<span style="color: #11740a; font-style: italic;">//Visualizzo il messaggio recuperando l'informazione tramite la costante utilizzata per il dictionary</span>
		<span style="color: #002200;">&#91;</span>self visualizzaMessaggio<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Programma avviato da una local notification&quot;</span> titolo<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>notifica.userInfo objectForKey<span style="color: #002200;">:</span>chiaveNome<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Sempre nello stesso metodo, aggiungiamo la cancellazione di tutte le notifiche locali e il richiamo del metodo per la creazione di una notifica.</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;">//Cancelliamo tutte le notifiche locali della nostra applicazione</span>
	<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIApplication sharedApplication<span style="color: #002200;">&#93;</span> cancelAllLocalNotifications<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">//Richiamiamo il metodo per la creazione della notifica</span>
	<span style="color: #11740a; font-style: italic;">//come parametro gli passo la data attuale</span>
	<span style="color: #002200;">&#91;</span>self impostaLocalNotification<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSDate</span> date<span style="color: #002200;">&#93;</span> ConNome<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;NotificaTest&quot;</span><span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

<p>Il metodo accetta in ingresso la data di notifica ed il nome che visualizzeremo nell’alertView.</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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;">	UILocalNotification <span style="color: #002200;">*</span>notifica<span style="color: #002200;">=</span><span style="color: #a61390;">nil</span>;
&nbsp;
	<span style="color: #11740a; font-style: italic;">//Verifico che il firmware sia il 4.0</span>
	<span style="color: #a61390;">float</span> version <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIDevice currentDevice<span style="color: #002200;">&#93;</span> systemVersion<span style="color: #002200;">&#93;</span> floatValue<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>version &gt;<span style="color: #002200;">=</span> <span style="color: #2400d9;">4.0</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#123;</span>
&nbsp;
		<span style="color: #11740a; font-style: italic;">//Istanzio la variabile che mi servirà per impostare la local notification</span>
		UILocalNotification <span style="color: #002200;">*</span>notifica <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UILocalNotification alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
&nbsp;
&nbsp;
		<span style="color: #11740a; font-style: italic;">//Imposto il fireDate che è la data ed ora di visualizzazione del messaggio</span>
		<span style="color: #11740a; font-style: italic;">//imposto come visualizzazione 1 minuti dopo la data specificata</span>
		notifica.fireDate <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>dataNotifica dateByAddingTimeInterval<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #2400d9;">1</span><span style="color: #002200;">*</span><span style="color: #2400d9;">60</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
&nbsp;
		<span style="color: #11740a; font-style: italic;">/*Imposto il timezone per esser certo che la data e l'ora impostate siano sempre corrette,
		 assegnando infatti l'oggetto timeZone, il fireDate viene regolato automaticamente
		 quando ci sono cambiamenti di fuso orario, di default il timeZone è &quot;nil&quot;.
		 */</span>
		notifica.timeZone <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSTimeZone</span> defaultTimeZone<span style="color: #002200;">&#93;</span>;
&nbsp;
		<span style="color: #11740a; font-style: italic;">//Messaggio che verrà visualizzato dall'iOS se la nostra applicazione è spenta</span>
		notifica.alertBody <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;%@ - notifica locale&quot;</span>,nome<span style="color: #002200;">&#93;</span>;
		<span style="color: #11740a; font-style: italic;">//Nome del pulsante per avviare la nostra applicazione</span>
		notifica.alertAction <span style="color: #002200;">=</span> <span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Dettagli&quot;</span>;
&nbsp;
		<span style="color: #11740a; font-style: italic;">//Qui possiamo impostare un suono, per semplicità impostiamo il suono di default</span>
		notifica.soundName <span style="color: #002200;">=</span> UILocalNotificationDefaultSoundName;
&nbsp;
		<span style="color: #11740a; font-style: italic;">//Aggiorniamo il badge dell'applicazione</span>
		notifica.applicationIconBadgeNumber <span style="color: #002200;">=</span> <span style="color: #2400d9;">1</span>;
&nbsp;
		<span style="color: #11740a; font-style: italic;">//aggiungiamo un dictionary con informazioni a piacere, in questo caso ho inserito il nome dell'evento</span>
		<span style="color: #11740a; font-style: italic;">// per utilizzarlo successivamente richiamandolo in base alla costante</span>
		<span style="color: #400080;">NSDictionary</span> <span style="color: #002200;">*</span>infoDict <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSDictionary</span> dictionaryWithObjectsAndKeys<span style="color: #002200;">:</span>nome,chiaveNome, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
		notifica.userInfo <span style="color: #002200;">=</span> infoDict;
&nbsp;
		<span style="color: #11740a; font-style: italic;">//Impostiamo la nostra local notification </span>
		<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIApplication sharedApplication<span style="color: #002200;">&#93;</span> scheduleLocalNotification<span style="color: #002200;">:</span>notifica<span style="color: #002200;">&#93;</span>;
&nbsp;
		<span style="color: #11740a; font-style: italic;">//Distruggiamo l'oggetto solo se istanziato</span>
		<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>notifica<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#123;</span>
			<span style="color: #002200;">&#91;</span>notifica release<span style="color: #002200;">&#93;</span>;
		<span style="color: #002200;">&#125;</span>
&nbsp;
	<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Intercettare una notifica locale quando l’applicazione è in esecuzione è semplicissimo.</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: #11740a; font-style: italic;">//Metodo per intercettare le notifiche durante l'esecuzione dell'app</span>
<span style="color: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>application<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIApplication <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>application didReceiveLocalNotification<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UILocalNotification <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>notif <span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>self visualizzaMessaggio<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>notif.userInfo objectForKey<span style="color: #002200;">:</span>chiaveNome<span style="color: #002200;">&#93;</span> titolo<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Notifica intercettata&quot;</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Questo è il metodo per visualizzare i messaggi.</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> visualizzaMessaggio<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>message titolo<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>titoloFinestra <span style="color: #002200;">&#123;</span>
	UIAlertView<span style="color: #002200;">*</span> alertView <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>titoloFinestra 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>alertView show<span style="color: #002200;">&#93;</span>;
	<span style="color: #a61390;">if</span> <span style="color: #002200;">&#40;</span>alertView<span style="color: #002200;">&#41;</span> <span style="color: #002200;">&#123;</span> 
		<span style="color: #002200;">&#91;</span>alertView release<span style="color: #002200;">&#93;</span>; 
	<span style="color: #002200;">&#125;</span>
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Ci sono altre proprietà che si possono impostare, ad esempio è possibile gestire la &#8220;ripetizione&#8221; del messaggio, oppure cambiare l’immagine di avvio dell’applicazione quando questa viene richiamata da una local notification.</p>
<p>Tutto è come sempre dettagliato nella documentazione ufficiale:</p>
<p><a href="http://developer.apple.com/iphone/library/documentation/iPhone/Reference/UILocalNotification_Class/Reference/Reference.html" target="_blank">http://developer.apple.com/iphone/library/documentation/iPhone/Reference/UILocalNotification_Class/Reference/Reference.html</a></p>
<p>Qui c&#8217;è un ottimo esempio scritto dalla Apple:</p>
<p><a href=" http://developer.apple.com/iphone/library/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/IPhoneOSClientImp/IPhoneOSClientImp.html" target="_blank"></p>
<p>http://developer.apple.com/iphone/library/documentation/NetworkingInternet/Conceptual/RemoteNotificationsPG/IPhoneOSClientImp/IPhoneOSClientImp.html</a></p>
<h4>Considerazioni finali</h4>
<p>Come potete vedere grazie all&#8217;SDK è tutto molto semplice, la classe <strong>UILocalNotification</strong> è comunque migliorabile.</p>
<p>Ad esempio si potrebbe migliorare la gestione della &#8220;cancellazione&#8221; di una local notification; attualmente infatti è possibile cancellarla solo “passando” la local notification che vogliamo eliminare, richiamando il seguente metodo:</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;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>cancelLocalNotification<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UILocalNotification <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>notification</pre></td></tr></table></div>

<p>Richiamando questo metodo invece cancelleremo tutte le local notification impostate dalla nostra applicazione:</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;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>cancelAllLocalNotifications</pre></td></tr></table></div>

<p>Nella mia applicazione ho la necessità di visualizzare le notifiche in base ai dati inseriti dall&#8217;utente.<br />
Il metodo di cancellazione di una notifica locale non mi aiuta molto nelle eventuali modifiche/cancellazioni dei dati dell’utente, dal momento che, per tenerne traccia, dovrei salvarmi l’istanza creata e “legarla” al record sul database.</p>
<p>Inoltre sarebbe molto dispendioso in termini di sviluppo tracciare tutte le modifiche dell’utente con la possibilità di bug.<br />
Ho scelto una strada semplice che racchiude tutta la gestione in un unico punto.<br />
All&#8217;uscita dell’applicazione cancello le local notifications e le riscrivo in base ai dati salvati dall’utente; in tal modo sono sicuro di ricreare sempre le local notifications corrette.</p>
<p>Fatemi sapere cosa ne pensate di questa nuova funzionalità!</p>
<p><center><br />
<a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/T066-Test-Notifiche-Locali-iphone.zip"><img src="http://www.devapp.it/wordpress/wp-content/uploads/2010/05/download_icon.png" alt="Icona Download" title="download_icon" width="33" height="40" class="alignnone size-full wp-image-3385" /></a> Se avete problemi con il tutorial, questo è il <a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/T066-Test-Notifiche-Locali-iphone.zip">nostro file di progetto</a>.<br />
</center></p>
]]></content:encoded>
			<wfw:commentRss>http://www.devapp.it/wordpress/t066-implementiamo-le-local-notification-nelle-nostre-applicazioni-iphone.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>IMPORTANTE: Nuovo forum per la Community</title>
		<link>http://www.devapp.it/wordpress/importante-nuovo-forum-per-la-community.html</link>
		<comments>http://www.devapp.it/wordpress/importante-nuovo-forum-per-la-community.html#comments</comments>
		<pubDate>Wed, 28 Jul 2010 17:17:32 +0000</pubDate>
		<dc:creator>Staff devAPP</dc:creator>
				<category><![CDATA[Comunicazioni]]></category>
		<category><![CDATA[forum]]></category>
		<category><![CDATA[forum programmazione iphone]]></category>

		<guid isPermaLink="false">http://www.devapp.it/wordpress/?p=4191</guid>
		<description><![CDATA[Probabilmente qualcuno ci avrà già fatto caso, nonostante ciò conviene forse spendere un paio di parole sulla recentissima (di oggi) novità della community: abbiamo un nuovo Forum! Come ben saprete, (ce lo avete segnalato in tanti), la vecchia versione del forum era scomoda da usare e poco funzionale, per questo, e soprattutto grazie ai vostri]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/vbulletin_logo.jpg"><img src="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/vbulletin_logo.jpg" alt="vBulletin Logo" title="vbulletin_logo" width="205" height="64" class="alignleft size-full wp-image-4192" /></a> Probabilmente qualcuno ci avrà già fatto caso, nonostante ciò conviene forse spendere un paio di parole sulla recentissima (di oggi) novità della community: <strong>abbiamo un nuovo Forum!</strong> Come ben saprete, (ce lo avete segnalato in tanti), la vecchia versione del forum era scomoda da usare e poco funzionale, per questo, e soprattutto grazie ai vostri consigli e alle vostre critiche (che sono certo ci faranno migliorare sempre più), abbiamo deciso di cambiare strada.<span id="more-4191"></span></p>
<h4>Il vecchio forum</h4>
<p>La scelta iniziale, di basare il nostro forum sul plugin &#8220;Simple:Press Forum&#8221; per wordpress è stata fatta più che altro per questioni estetiche. Un forum strutturato come plugin, di fatto, si integra perfettamente nel sito stesso, basato appunto su wordpress. La nostra poca esperienza nella scelta delle piattaforme, però, non ci ha fatto considerare più di tanto l&#8217;importanza reale che riveste questo importante e fondamentale strumento. Altro motivo di tale scelta è stata per via di un&#8217;unica registrazione per i nostri utenti, valida sia per il blog che per il forum. A conti fatti, però, l&#8217;iscrizione al blog (autori esclusi) è del tutto superflua, anzi, ad oggi serve esclusivamente per postare proprio sul forum.</p>
<p>Un po&#8217; in ritardo, (ma meglio tardi che mai <img src='http://www.devapp.it/wordpress/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ), abbiamo deciso di cambiare e di passare a una piattaforma più professionale. Ci abbiamo ragionato su parecchio per scegliere la versione più adatta, abbiamo testato sia phpbb che altre piattaforme free e alla fine abbiamo deciso di appoggiarci ad una versione commerciale: <strong>vBulletin</strong> (ad oggi alla versione 4.0.5).</p>
<h4> Il nostro nuovo forum</h4>
<p>vBulletin è sicuramente un&#8217;ottima piattaforma per il forum e spero che sarà di vostro gradimento. (In effetti il pannello amministrativo è pressochè infinito <img src='http://www.devapp.it/wordpress/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ). Avremmo potuto cambiare anche la parte relativa al blog e passare completamente a vBulletin (l&#8217;ultima versione integra cms e blog), ma dopo un&#8217;accurata analisi la mia personale conclusione è che non sia ancora pronto, non come serve a noi almeno, wordpress è più che perfetto. Inoltre abbiamo da poco rinnovato la grafica e un altro cambio estetico potrebbe creare più confusione che altro.</p>
<p>In conclusione l&#8217;attuale configurazione, e credo la definitiva (temi grafici a parte) è questa:</p>
<ul>
<li><strong>Sito (blog)</strong>: basato su wordpress</li>
<li><strong>Forum</strong>: basato su vBulletin</li>
</ul>
<h4>Cosa comporta questo cambiamento?</h4>
<p>Una cosa un po&#8217; scomoda forse, ma non impossibile: <strong>occorrerà una nuova registrazione al forum</strong> per poter sfruttare questa nuova versione. Non è necessario utilizzare nick o mail diverse, anzi, è consigliabile fare la nuova iscrizione mantenendo gli stessi dati, in modo tale da poterci riconoscere ancora. </p>
<p><strong>ATTENZIONE:</strong> <em>Se volete accedere al forum dovrete registrarvi tramite il <a href="http://www.devapp.it/wordpress/forum/register.php" target="_blank">seguente indirizzo</a></em></p>
<p>I lavori sono ancora in corso, quindi potreste riscontrare alcune anomalie nei prossimi giorni, ma abbiate fiducia, pian piano vedrete tornare tutto alla normalità <img src='http://www.devapp.it/wordpress/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Per quanto riguarda la migrazione del vecchio forum,  infine, ci sono ancora alcuni problemi che vedremo di risolvere al più presto. Questo perchè probabilmente siamo riusciti a scegliere (inizialmente) il forum peggiore <img src='http://www.devapp.it/wordpress/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  per quanto riguarda la migrazione ad altre piattaforme.</p>
<p>Vorrei precisare che Simple:Press rimane comunque un ottimo plugin per wordpress che tutto sommato non ci ha dato grossi problemi di gestione. Forse, però, è più adatto a chi ha esigenze minori rispetto alle nostre, dove, anche solo un buon editor per postare codice o screenshot, può rivelarsi di vitale importanza.</p>
<h4>Iscrizione Newsletter devAPP</h4>
<p>Ultima cosa, se volete iscrivervi alla nostra newsletter (chi è iscritto sa che non siamo poi così invadenti), potrete farlo semplicemente inserendo la vostra mail nel box &#8220;Newsletter&#8221; sulla sidebar (la barra laterale) sinistra. Dopodichè dovrete solo più cliccare sul pulsante &#8220;Subscribe&#8221;, come mostrato in fugura:</p>
<p><center><br />
<a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/newsletter-box.jpg"><img src="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/newsletter-box.jpg" alt="newsletter box" title="newsletter-box" width="245" height="149" class="aligncenter size-full wp-image-4193" /></a><br />
</center></p>
<p>Ovviamente potrete cancellare la vostra iscrizione in ogni momento con qualche semplice click!!</p>
<p>Per ora è tutto, speriamo che la novità, nonostante qualche piccolo imprevisto, sia di vostro gradimento.</p>
<p>Mi raccomando, continuate a consigliare, criticare, scrivere (la nostra mail se ancora non la conoscete è <a href="mailto:info@devapp.it">info@devapp.it</a>)</p>
<p>A presto <img src='http://www.devapp.it/wordpress/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><strong>PS:</strong> la sorpresa in arrivo segnalata su <a href="http://twitter.com/iPhone_devAPP" target="_blank">twitter</a> e <a href="http://www.facebook.com/pages/devAPP/229204847765#/pages/devAPP/229204847765" target="_blank">facebook</a> non è questa, dovrete pazientare ancora un pochino per conoscerla.. ^^</p>
]]></content:encoded>
			<wfw:commentRss>http://www.devapp.it/wordpress/importante-nuovo-forum-per-la-community.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Panoramica sul &#8220;File System Locale&#8221; delle nostre applicazioni iPhone (iOS)</title>
		<link>http://www.devapp.it/wordpress/panoramica-sul-file-system-locale-delle-nostre-applicazioni-iphone-ios.html</link>
		<comments>http://www.devapp.it/wordpress/panoramica-sul-file-system-locale-delle-nostre-applicazioni-iphone-ios.html#comments</comments>
		<pubDate>Mon, 26 Jul 2010 12:47:14 +0000</pubDate>
		<dc:creator>Staff devAPP</dc:creator>
				<category><![CDATA[Tutorial Pratici]]></category>
		<category><![CDATA[Caches]]></category>
		<category><![CDATA[CFPreferences API]]></category>
		<category><![CDATA[Documents]]></category>
		<category><![CDATA[File sharing]]></category>
		<category><![CDATA[NSUserDefaults]]></category>
		<category><![CDATA[pasteboard]]></category>
		<category><![CDATA[Preferences]]></category>
		<category><![CDATA[tmp]]></category>

		<guid isPermaLink="false">http://www.devapp.it/wordpress/?p=4062</guid>
		<description><![CDATA[Qualche giorno fa vi abbiamo proposto un tutorial sulla gestione dei File all&#8217;interno delle nostre applicazioni iPhone, vediamo oggi di approfondire l&#8217;argomento offrendovi una panoramica del File System Locale. Niente di complicato, vedremo semplicemente come sono organizzate le cartelle all&#8217;interno dei nostri programmi e cercheremo di capire come dovremo organizzare i nostri file all&#8217;interno delle]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/gestione-file-applicazioni-iphone-devapp.png"><img src="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/gestione-file-applicazioni-iphone-devapp.png" alt="gestione file applicazioni iphone devapp" title="gestione-file-applicazioni-iphone-devapp" width="135" height="114" class="alignleft size-full wp-image-4003" /></a> Qualche giorno fa vi abbiamo proposto un <a href="http://www.devapp.it/wordpress/gestione-dei-file-nelle-nostre-applicazione-iphone.html" target="_blank">tutorial sulla gestione dei File</a> all&#8217;interno delle nostre applicazioni iPhone, vediamo oggi di approfondire l&#8217;argomento offrendovi una panoramica del File System Locale. Niente di complicato, vedremo semplicemente come sono organizzate le cartelle all&#8217;interno dei nostri programmi e cercheremo di capire come dovremo organizzare i nostri file all&#8217;interno delle stesse.</p>
<p>Come ben saprete molti programmi hanno la necessità di salvare file, che siano questi foto, video, piuttosto che documenti di testo o ancora impostazioni varie dell&#8217;applicazione. Insomma, l&#8217;uso dei file in un programma è praticamente d&#8217;obbligo per la quasi totalità delle applicazioni esistenti. Ma dove dobbiamo salvare i nostri file? Come sono organizzate le cartelle all&#8217;interno dei nostri programmi iPhone? Di cosa dovremo tenere conto durante la scelta della corretta posizione?<span id="more-4062"></span></p>
<p>La tabella seguente e le informazioni a seguire, prelevate direttamente dalla <a href="https://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/RuntimeEnvironment/RuntimeEnvironment.html" target="_blank">documentazione ufficiale Apple</a>, ci chiariranno senz&#8217;altro le idee:</p>
<table>
<tr>
<td><strong>Directory</strong></td>
<td><strong>Descrizione</strong></td>
</tr>
<tr>
<td>Application_Home/AppName.app</td>
<td>Questa è la directory contenente l&#8217;applicazione stessa (bundle). Dovremo fare attenzione a non effettuare cambiamenti al contenuto di questa directory a runtime. Così facendo farete in modo che l&#8217;applicazione possa avviarsi anche altre volte. Da iOS 2.1 in poi, il contenuto di questa directory non viene &#8220;backuppato&#8221; da iTunes. Tuttavia, iTunes esegue una sincronizzazione iniziale di tutte le applicazioni acquistate da App Store. Quindi alla prima sincronizzazione verrà comunque fatto un backup anche di questa cartella.</td>
</tr>
<tr>
<td>Application_Home/Documents/</td>
<td>Questa è cartella che dovremo utilizzare per archiviare i documenti degli utenti e i file di dati (configurazioni varie) dell&#8217;applicazione. I contenuti di questa directory potranno inoltre essere resi disponibili agli utenti attraverso la condivisione di file con un computer desktop.</td>
</tr>
<tr>
<td>Application_Home/Library/Preferences</td>
<td>Questa directory contiene i file delle preferenze della specifica applicazione. Non dovremmo mai creare file di preferenze direttamente, dovremmo invece sfruttare la classe &#8220;<em>NSUserDefaults</em>&#8221; o le &#8220;<em>CFPreferences API</em>&#8221; per leggere e settare le preferenze di un&#8217;applicazione. Il contenuto di questa directory viene &#8220;backuppato&#8221; da iTunes.</td>
</tr>
<tr>
<td>Application_Home/Library/Caches</td>
<td>Usate questa directory per salvare qualsiasi file di supporto per la vostra applicazione che volete ritrovare ai successivi avvii dell&#8217;applicazione. Sarà poi l&#8217;applicazione stessa responsabile dell&#8217;aggiunta e la rimozione di questi file. iTunes rimuove questi file durante un ripristino completo (full restore) del dispositivo, sarà vostra cura essere abili nel ricrearli quando necessario. Da iOS 2.2 in poi, il contenuto di questa directory non viene &#8220;backuppato&#8221; da iTunes. </td>
</tr>
<tr>
<td>Application_Home/tmp/</td>
<td>Usate questa directory per salvare file temporanei di cui non necessitate la presenza durante successivi avvii dell&#8217;applicazione. Dovreste far in modo, inoltre, di rimuovere i file quando ritenete che questi non siano più necessari. Da iOS 2.1 in poi, il contenuto di questa directory non viene backuppato da iTunes.</td>
</tr>
</table>
<p>Come vedete ogni cartella è stata creata per uno scopo specifico. Programmare le nostre applicazioni iPhone, tenendo conto di questi fattori, eviterà eventuali imprevisti o problemi legati al programma stesso.</p>
<h4>Case Sensitivity</h4>
<p>Il file system dei dispositivi basati su iOS è <strong>CASE SENSITIVE</strong>. Quando lavorerete con i nomi dei file (e tutto il percorso in genere), dovrete essere certi di utilizzare correttamente maiuscole e minuscole, esattamente come li avevate salvati, o non sarete in grado di aprire o accedere ai file.</p>
<h4>Condividere File con computer desktop</h4>
<p>Se volete offrire agli utenti la possibilità di accerere ai file del vostro programma tramite computer desktop, potrete farlo tramite il file sharing. Tramite il <em>file sharing</em> abiliterete la condivisione dei file esclusivamente dall&#8217;applicazione al computer desktop dell&#8217;utente. Non permette quindi la condivisione con altre applicazioni sullo stesso device.  Per condividere dati e file tra applicazioni diverse dovrete ovviare usando la &#8220;<em>pasteboard</em>&#8220;, o sfruttare un controller apposito.</p>
<h4>Backup e Restore</h4>
<p>iTunes si preoccupa automaticamente di effettuare backup e ripristino dei dati degli utenti in particolari condizioni. Dovrete però sapere dove mettere i vile per essere certi che questi vengano correttamente &#8220;backuppati&#8221; e all&#8217;occorrenza ripristinati, in base alle vostre necessità.</p>
<h4>Cosa viene backuppato?</h4>
<p>Innanzitutto non dovrete preparare le vostre applicazioni in alcun modo per quanto riguarda le operazioni di backup e ripristino. Da iOS 2.2 in poi, infatti, quando un dispositivo viene connesso a un computer e sincronizzato, iTunes avvia un backup incrementale di tutti i file, eccetto quelli presenti nelle seguenti directory:</p>
<ul>
<li>Application_Home/AppName.app</li>
<li>Application_Home/Library/Caches</li>
<li>Application_Home/tmp</li>
</ul>
<p>Anche se iTunes fa il backup del <em>bundle</em> dell&#8217;applicazione stessa, non lo fa durante ogni operazione di sincronizzazione. Le applicazioni acquistate dall&#8217;App Store direttamente dal device, ad esempio, sono backuppate alla successiva sincronizzazione con iTunes. Le applicazioni, però,  non verranno backuppate più durante le successive operazioni di sincronizzazione, a meno che l&#8217;applicazione stessa sia cambiata (ad esempio a causa di un aggiornamento). </p>
<p>Per far in modo che il processo di sincronizzazione non duri per un periodo troppo lungo, dovrete essere selettivi sulla posizione scelta durante il salvataggio dei file nelle directory della vostra applicazione. La directory <em>Application_Home/Documents</em> dovrebbe essere usata per salvare i documenti degli utenti e i file dati dell&#8217;applicazione. I file temporanei delle vostre applicazioni dovrebbero quini essere posti all&#8217;interno della cartella <em>Application_Home/tmp</em> ed essere cancellati dall&#8217;applicazione stessa quando non servono più. Se la vostra applicazione avesse la necessità di creare file che devono essere presenti durante gli avvii successivi, ma non necessitano di backup, dovrete porli all&#8217;interno della cartella <em>Application_Home/Library/Caches</em>.</p>
<p><strong>NOTA:</strong><br />
Se la vostra applicazione crea file di grandi dimensioni, o file che vengono modificati frequentemente, dovreste considerare di inserirli nella cartella <em>Application_Home/Library/Caches</em> (che non viene &#8220;backuppata&#8221;) e non all&#8217;interno di <em>Application_Home/Documents</em>. Il Backup (o il restore) di grandi file possono infatti rallentare l&#8217;intero processo in modo sisgnificativo. Stesse regole per quanto riguarda i file che vengono modificati frequentemente (e di conseguenza che devono essere &#8220;backuppati&#8221; frequentemente). Posizionare questi file nella cartella &#8220;<em>Caches</em>&#8221; fa si che non vengano &#8220;backuppati&#8221; (da iOS 2.2 in poi) durante ogni operazione di sincronizzazione.</p>
<h4>File salvati durante gli aggiornamenti dell&#8217;applicazione</h4>
<p>Quando un utente scarica un aggiornamento per un&#8217;applicazione, iTunes installa l&#8217;aggiornamento in una nuova directory. Successivamente sposta i file utente dalla vecchia installazione alla nuova ed infine cancella la vecchia installazione. I file nelle seguenti directory saranno presenti anche nella nuova versione dopo il processo di aggiornamento:</p>
<ul>
<li>Application_Home/Documents</li>
<li>Application_Home/Library/Preferences</li>
</ul>
<p>Sebbene anche i file di altre directory potrebbero essere spostati, non dovrete fare affidamento su questo per i vostri aggiornamenti.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.devapp.it/wordpress/panoramica-sul-file-system-locale-delle-nostre-applicazioni-iphone-ios.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>T#065 &#8211; Registrare le estensioni di file supportate da un Applicazione iPhone</title>
		<link>http://www.devapp.it/wordpress/t065-registrare-le-estensioni-di-file-supportate-da-un-applicazione-iphone.html</link>
		<comments>http://www.devapp.it/wordpress/t065-registrare-le-estensioni-di-file-supportate-da-un-applicazione-iphone.html#comments</comments>
		<pubDate>Thu, 22 Jul 2010 10:36:23 +0000</pubDate>
		<dc:creator>Staff devAPP</dc:creator>
				<category><![CDATA[Tutorial Pratici]]></category>
		<category><![CDATA[CFBundleTypeName]]></category>
		<category><![CDATA[estensioni file iPhone]]></category>
		<category><![CDATA[file iphone]]></category>
		<category><![CDATA[Francesco Noya]]></category>
		<category><![CDATA[info.plist]]></category>
		<category><![CDATA[NSData]]></category>
		<category><![CDATA[NSFileManager]]></category>

		<guid isPermaLink="false">http://www.devapp.it/wordpress/?p=4076</guid>
		<description><![CDATA[Ciao a tutti, sono Francesco Noya, un nuovo autore di questa community di programmazione iPhone, e come primo articolo ho deciso di parlarvi di &#8220;estensioni di file&#8221;. A partire dalla versione 3.2 dell&#8217;SDK di Apple, infatti, è possibile registrare le estensioni di file che un&#8217;applicazione è in grado di gestire. Questo permette, ad esempio, di]]></description>
			<content:encoded><![CDATA[<p>Ciao a tutti, sono Francesco Noya, un nuovo autore di questa community di programmazione iPhone, e come primo articolo ho deciso di parlarvi di &#8220;estensioni di file&#8221;. A partire dalla versione 3.2 dell&#8217;SDK di Apple, infatti, è possibile registrare le estensioni di file che un&#8217;applicazione è in grado di gestire. Questo permette, ad esempio, di <strong>creare il proprio lettore di pdf</strong> da utilizzare quando si apre un allegato in Mail o con Safari. In questo tutorial vedremo come creare una piccola applicazione che apre automaticamente i file pdf e li mostra in una UIWebview.</p>
<p>Per prima cosa creiamo una &#8220;Window-based application&#8221; e diamole un nome (io l&#8217;ho chiamata &#8220;PDFFromSafari&#8221;).</p>
<p>A questo punto modifichiamo il file <em>info.plist</em> per registrare le estensioni che la nostra applicazione sarà in grado di manipolare. Per farlo impostiamo la visualizzazione del file come &#8220;Source Code File&#8221; in modo da vedere la sua struttura come file xml.<span id="more-4076"></span></p>
<p><center><br />
<a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/t065-registrare-estensioni-file-iphone-01.jpg"><img src="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/t065-registrare-estensioni-file-iphone-01.jpg" alt="t065 registrare estensioni file iphone 01" title="t065-registrare-estensioni-file-iphone-01" width="480" height="370" class="aligncenter size-full wp-image-4078" /></a><br />
</center></p>
<p>Il file aperto si presenta più o meno così:</p>
<p><center><br />
<a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/t065-registrare-estensioni-file-iphone-02.jpg"><img src="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/t065-registrare-estensioni-file-iphone-02.jpg" alt="t065 registrare estensioni file iphone 02" title="t065-registrare-estensioni-file-iphone-02" width="397" height="260" class="aligncenter size-full wp-image-4079" /></a><br />
</center></p>
<p>Andiamo ad aggiungere le seguenti righe:</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
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;">	&lt;key&gt;UIApplicationExitsOnSuspend&lt;<span style="color: #002200;">/</span>key&gt;
	&lt;true<span style="color: #002200;">/</span>&gt;
&nbsp;
	&lt;key&gt;CFBundleDocumentTypes&lt;<span style="color: #002200;">/</span>key&gt;
	&lt;array&gt;
		&lt;dict&gt;
			&lt;key&gt;CFBundleTypeIconFiles&lt;<span style="color: #002200;">/</span>key&gt;
			&lt;array&gt;
				&lt;string&gt;&lt;<span style="color: #002200;">/</span>string&gt;
			&lt;<span style="color: #002200;">/</span>array&gt;
			&lt;key&gt;CFBundleTypeName&lt;<span style="color: #002200;">/</span>key&gt;
			&lt;string&gt;NSPasteboardTypePDF&lt;<span style="color: #002200;">/</span>string&gt;
			&lt;key&gt;CFBundleTypeRole&lt;<span style="color: #002200;">/</span>key&gt;
			&lt;string&gt;Viewer&lt;<span style="color: #002200;">/</span>string&gt;
			&lt;key&gt;LSHandlerRank&lt;<span style="color: #002200;">/</span>key&gt;
			&lt;string&gt;Alternate&lt;<span style="color: #002200;">/</span>string&gt;
			&lt;key&gt;LSItemContentTypes&lt;<span style="color: #002200;">/</span>key&gt;
			&lt;array&gt;
				&lt;string&gt;com.adobe.pdf&lt;<span style="color: #002200;">/</span>string&gt;
			&lt;<span style="color: #002200;">/</span>array&gt;
		&lt;<span style="color: #002200;">/</span>dict&gt;
	&lt;<span style="color: #002200;">/</span>array&gt;</pre></td></tr></table></div>

<p>Analizziamo quello che abbiamo scritto:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;">&lt;key&gt;UIApplicationExitsOnSuspend&lt;<span style="color: #002200;">/</span>key&gt;
&lt;true<span style="color: #002200;">/</span>&gt;</pre></td></tr></table></div>

<p>Questa opzione impone all’applicazione di chiudersi quando si preme il pulsante dell’iPhone anziché entrare in Background. Ovviamente questo si applica solo se il dispositivo su cui lavoriamo è al iOS 4, altrimenti questo è il comportamento standard.</p>
<p>Le righe successive invece riguardano proprio la registrazione delle estensioni gestite dall’applicazione.</p>
<p>In particolare:</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;">&lt;key&gt;CFBundleTypeIconFiles&lt;<span style="color: #002200;">/</span>key&gt;</pre></td></tr></table></div>

<p>Contiene un array di stringhe  contenenti il percorso all’icona che viene associata al file nel menù contestuale dei programmi che lo possono aprire.</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;">&lt;key&gt;CFBundleTypeName&lt;<span style="color: #002200;">/</span>key&gt;</pre></td></tr></table></div>

<p>Ha una stringa con il nome del tipo di documento che apre (nel nostro esempio “NSPasteboardTypePDF”).</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;">&lt;key&gt;LSHandlerRank&lt;<span style="color: #002200;">/</span>key&gt;</pre></td></tr></table></div>

<p>Raprresenta il ruolo che ha l’applicazione. Nel nostro caso con Alternate specifichiamo che si tratta di un modo alternativo per aprire il file  </p>
<p>Infine:</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;">&lt;key&gt;LSItemContentTypes&lt;<span style="color: #002200;">/</span>key&gt;</pre></td></tr></table></div>

<p>contiene un Array di Uniform Type Identifiers (UTIs) che l’applicazione è in grado d’aprire. Nel nostro esempio i PDF: com.adobe.pdf</p>
<p>Ora che abbiamo modificato il file info.plist salviamolo e andiamo a scrivere il codice dell’ applicazione. In particolar modo quello che facciamo è cambiare il metodo</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;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">BOOL</span><span style="color: #002200;">&#41;</span>application<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIApplication <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>application didFinishLaunchingWithOptions<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>launchOptions</pre></td></tr></table></div>

<p>Dell&#8217;Application Delegate.</p>
<p>Ecco le modifiche da fare:</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
28
29
30
31
32
33
34
35
36
37
</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;">BOOL</span><span style="color: #002200;">&#41;</span>application<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UIApplication <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>application didFinishLaunchingWithOptions<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>launchOptions <span style="color: #002200;">&#123;</span>    
&nbsp;
	<span style="color: #400080;">NSURL</span> <span style="color: #002200;">*</span>urlFileEsterno <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSURL</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#91;</span>launchOptions valueForKey<span style="color: #002200;">:</span>UIApplicationLaunchOptionsURLKey<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #a61390;">if</span><span style="color: #002200;">&#40;</span>urlFileEsterno <span style="color: #002200;">!=</span> <span style="color: #a61390;">NULL</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#123;</span>
		<span style="color: #11740a; font-style: italic;">//carico il pdf in un oggetto NSData</span>
		<span style="color: #400080;">NSData</span> <span style="color: #002200;">*</span>pdf <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSData</span> alloc<span style="color: #002200;">&#93;</span> initWithContentsOfURL<span style="color: #002200;">:</span>urlFileEsterno<span style="color: #002200;">&#93;</span>;
&nbsp;
		UIWebView <span style="color: #002200;">*</span>webview <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIWebView alloc<span style="color: #002200;">&#93;</span> initWithFrame<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIScreen mainScreen<span style="color: #002200;">&#93;</span>bounds<span style="color: #002200;">&#93;</span><span style="color: #002200;">&#93;</span>; 
		<span style="color: #002200;">&#91;</span>webview loadData<span style="color: #002200;">:</span>pdf MIMEType<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;application/pdf&quot;</span> textEncodingName<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span> baseURL<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
		<span style="color: #002200;">&#91;</span>pdf release<span style="color: #002200;">&#93;</span>;
&nbsp;
		webview.scalesPageToFit <span style="color: #002200;">=</span> <span style="color: #a61390;">YES</span>;
		<span style="color: #002200;">&#91;</span>window addSubview<span style="color: #002200;">:</span>webview<span style="color: #002200;">&#93;</span>; 
		<span style="color: #002200;">&#91;</span>webview release<span style="color: #002200;">&#93;</span>; 	
&nbsp;
		<span style="color: #11740a; font-style: italic;">//elimino il file copiato sul dispositivo</span>
		<span style="color: #400080;">NSFileManager</span> <span style="color: #002200;">*</span>filemanager <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSFileManager</span> defaultManager<span style="color: #002200;">&#93;</span>;
		<span style="color: #002200;">&#91;</span>filemanager removeItemAtURL<span style="color: #002200;">:</span>urlFileEsterno error<span style="color: #002200;">:</span><span style="color: #a61390;">NULL</span><span style="color: #002200;">&#93;</span>;
		<span style="color: #002200;">&#91;</span>filemanager release<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #002200;">&#125;</span><span style="color: #a61390;">else</span> <span style="color: #002200;">&#123;</span>
		<span style="color: #11740a; font-style: italic;">//mostro un alert</span>
		UIAlertView <span style="color: #002200;">*</span>popUp <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;Aprimi da Safari&quot;</span>
														message<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Prova ad aprirmi da Safari o dal programma Mail&quot;</span> 
													   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>popUp show<span style="color: #002200;">&#93;</span>;
		<span style="color: #002200;">&#91;</span>popUp release<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#125;</span>
&nbsp;
&nbsp;
    <span style="color: #002200;">&#91;</span>window makeKeyAndVisible<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #a61390;">return</span> <span style="color: #a61390;">YES</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Vediamo di capire cosa fa:</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: #400080;">NSURL</span> <span style="color: #002200;">*</span>urlFileEsterno <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSURL</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#91;</span>launchOptions valueForKey<span style="color: #002200;">:</span>UIApplicationLaunchOptionsURLKey<span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

<p>Questo è l’URL del file esterno. Ogni volta che un file viene aperto questi viene memorizzato all’interno della sottocartella inbox dei Documents dell’applicazione.</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;">if</span><span style="color: #002200;">&#40;</span>urlFileEsterno <span style="color: #002200;">!=</span> <span style="color: #a61390;">NULL</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#123;</span></pre></td></tr></table></div>

<p>Controllo l’esistenza del file. Se il file esiste allora lo salvo all’interno di un oggetto NSData grazie al metodo:</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: #400080;">NSData</span> <span style="color: #002200;">*</span>pdf <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSData</span> alloc<span style="color: #002200;">&#93;</span> initWithContentsOfURL<span style="color: #002200;">:</span>urlFileEsterno<span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

<p>Questo permette di aprire il file in una UIWebView con il metodo</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>webview loadData<span style="color: #002200;">:</span>pdf MIMEType<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;application/pdf&quot;</span> textEncodingName<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span> baseURL<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

<p>Per finire istanziamo un oggetto NSFileManager che si occupa di eliminare il file creato (Ovviamente nulla ci vieta di tenerlo):</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;">	<span style="color: #400080;">NSFileManager</span> <span style="color: #002200;">*</span>filemanager <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #400080;">NSFileManager</span> defaultManager<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>filemanager removeItemAtURL<span style="color: #002200;">:</span>urlFileEsterno error<span style="color: #002200;">:</span><span style="color: #a61390;">NULL</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>filemanager release<span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

<p>(NB. Il metodo removeItemAtURL è stato introdotto dalla SDK 4, per cui se state usando versioni precedenti dovrete usare qualche accorgimento e cambiare il metodo con removeItemAtPath).</p>
<p>Quello che fa il blocco dell’else è semplicemente visualizzare un alert quando si apre l’applicazione in maniera “normale”, senza passare da Safari (o chi per esso).</p>
<p>Salviamo ed eseguiamo… dal momento che il simulatore non ha Mail, ho testato il funzionamento dell’app aprendo Gmail da Safari ed andando ad aprire una mail con allegato un pdf. </p>
<p>Vediamo il risultato:</p>
<p>se avvio l’applicazione:</p>
<p><center><br />
<a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/t065-registrare-estensioni-file-iphone-03.png"><img src="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/t065-registrare-estensioni-file-iphone-03.png" alt="t065 registrare estensioni file iphone 03" title="t065-registrare-estensioni-file-iphone-03" width="368" height="710" class="aligncenter size-full wp-image-4080" /></a><br />
</center></p>
<p>Quando apro il pdf in Safari compare il menu Apri in:</p>
<p><center><br />
<a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/t065-registrare-estensioni-file-iphone-04.png"><img src="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/t065-registrare-estensioni-file-iphone-04.png" alt="t065 registrare estensioni file iphone 04" title="t065-registrare-estensioni-file-iphone-04" width="365" height="696" class="aligncenter size-full wp-image-4081" /></a><br />
</center></p>
<p>Lo stesso pdf aperto nella nostra applicazione:</p>
<p><center><br />
<a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/t065-registrare-estensioni-file-iphone-05.png"><img src="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/t065-registrare-estensioni-file-iphone-05.png" alt="t065 registrare estensioni file iphone 05" title="t065-registrare-estensioni-file-iphone-05" width="366" height="653" class="aligncenter size-full wp-image-4082" /></a><br />
</center></p>
<h4>Considerazioni Finali</h4>
<p>Ciò che rende molto potente il meccanismo delle UTI è che permette di definire anche tipi di file proprietari. Se siete interessati ad un esempio che include la definizione di UTI personali vi rimando a questa discussione su StackOverflow (in Inglese) al <a href="http://stackoverflow.com/questions/2774343/how-do-i-associate-file-types-with-an-iphone-application" target="_blank">seguente indirizzo</a>.</p>
<p>Per avere invece maggiori informazioni, invece, sulla definizione dei CFBundleDocumentTypes questi sono alcuni link alla documentazione Apple:</p>
<p><a href="http://developer.apple.com/iphone/library/documentation/General/Conceptual/iPadProgrammingGuide/CoreApplication/CoreApplication.html#//apple_ref/doc/uid/TP40009370-CH6-SW11" target="_blank">http://developer.apple.com/iphone/library/documentation/General/Conceptual/iPadProgrammingGuide/CoreApplication/CoreApplication.html#//apple_ref/doc/uid/TP40009370-CH6-SW11</a></p>
<p><a href="http://developer.apple.com/iphone/library/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/TP40009249-101685-TPXREF107" target="_blank">http://developer.apple.com/iphone/library/documentation/General/Reference/InfoPlistKeyReference/Articles/CoreFoundationKeys.html#//apple_ref/doc/uid/TP40009249-101685-TPXREF107</a></p>
<p><a href="http://developer.apple.com/iphone/library/documentation/uikit/reference/UIDocumentInteractionController_class/Reference/Reference.html" target="_blank">http://developer.apple.com/iphone/library/documentation/uikit/reference/UIDocumentInteractionController_class/Reference/Reference.html</a></p>
<p><center><br />
<a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/T065-PDFFromSafari.zip"><img src="http://www.devapp.it/wordpress/wp-content/uploads/2010/05/download_icon.png" alt="Icona Download" title="download_icon" width="33" height="40" class="alignnone size-full wp-image-3385" /></a> Se avete problemi con il tutorial, questo è il <a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/T065-PDFFromSafari.zip">nostro file di progetto</a>.<br />
</center></p>
]]></content:encoded>
			<wfw:commentRss>http://www.devapp.it/wordpress/t065-registrare-le-estensioni-di-file-supportate-da-un-applicazione-iphone.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>ioProgrammo 153: altri 2 articoli a cura di devAPP</title>
		<link>http://www.devapp.it/wordpress/ioprogrammo-153-altri-2-articoli-a-cura-di-devapp.html</link>
		<comments>http://www.devapp.it/wordpress/ioprogrammo-153-altri-2-articoli-a-cura-di-devapp.html#comments</comments>
		<pubDate>Wed, 21 Jul 2010 08:51:10 +0000</pubDate>
		<dc:creator>Staff devAPP</dc:creator>
				<category><![CDATA[Comunicazioni]]></category>
		<category><![CDATA[andrea busi]]></category>
		<category><![CDATA[gino sarnieri]]></category>
		<category><![CDATA[ioProgrammo]]></category>
		<category><![CDATA[programmazione Mac]]></category>
		<category><![CDATA[pubblicazioni devAPP]]></category>
		<category><![CDATA[Rino Picardi]]></category>
		<category><![CDATA[Samsung Bada]]></category>

		<guid isPermaLink="false">http://www.devapp.it/wordpress/?p=4063</guid>
		<description><![CDATA[Altri due articoli a cura dello staff di devAPP sul nuovo numero della nota rivista di programmazione ioProgrammo, di Edizioni Master, con cui collaboriamo da qualche mese. In edicola (disponibile da oggi), sul numero 153, trovate infatti due nuove nostre pubblicazioni. Anche per questo numero ci è stata affidata la Cover Story (l&#8217;articolo di copertina),]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/04/ioProgrammo1.png"><img src="http://www.devapp.it/wordpress/wp-content/uploads/2010/04/ioProgrammo1.png" alt="Logo ioProgrammo" title="ioProgrammo" width="220" height="74" class="alignleft size-full wp-image-3116" /></a> Altri due articoli a cura dello staff di devAPP sul nuovo numero della nota rivista di programmazione <a href="http://www.ioprogrammo.it/" target="_blank">ioProgrammo</a>, di <a href="http://www.edmaster.it/" target="_blank">Edizioni Master</a>, con cui collaboriamo da qualche mese. In edicola (disponibile da oggi), sul numero 153, trovate infatti due nuove nostre pubblicazioni. Anche per questo numero ci è stata affidata la <strong>Cover Story</strong> (l&#8217;articolo di copertina), che abbiamo dedicato, questa volta, alla <strong>programmazione Mac</strong>, presentando una panoramica generica e un&#8217;esercitazione pratica per la realizzazione di un semplice editor di testi, sfruttando un classico esempio Apple.<span id="more-4063"></span></p>
<p>Il secondo articolo, a cura del nostro autore Gino Sarnieri, propone invece un tutorial sulla realizzazione della nostra prima applicazione per il nuovo OS di Samsung: Bada, ricordiamo, il nuovo antagonista di iPhone OS che promette davvero molto bene.</p>
<p>Ecco cosa troverete di nostro in questo nuovo numero:</p>
<p><center></p>
<h4>ioProgrammo N. 153 &#8211; AGOSTO 2010</h4>
<p></center></p>
<p><a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/ioProgrammo-153.jpg"><img src="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/ioProgrammo-153.jpg" alt="ioProgrammo 153" title="ioProgrammo-153" width="250" height="342" class="alignleft size-full wp-image-4064" /></a><br />
<strong>ARTICOLO 1</strong><br />
<strong>TITOLO:</strong> Apple programming, sviluppare per Mac<br />
<strong>ARGOMENTO:</strong>&#8220;Dai un morso alla Mela! Scopri come entrare nel mondo dello sviluppo MAC&#8221;<br />
<strong>AUTORI:</strong> Rino Picardi e Andrea Busi<br />
<strong>PAGINE ARTICOLO:</strong> 6 (da pag. 14 a pag. 19)<br />
<strong>COSTO RIVISTA + CD:</strong> € 6,99<br />
<strong>COSTO RIVISTA + CARTE + CD:</strong> € 9,99<br />
<strong>COVER STORY</strong> a cura di devAPP</p>
<p><strong>ARTICOLO 2</strong><br />
<strong>TITOLO:</strong> Samsung BADA: La prima applicazione<br />
<strong>ARGOMENTO:</strong> Tutorial sulla realizzazione della prima applicazione BADA<br />
<strong>AUTORE:</strong> Gino Sarnieri<br />
<strong>PAGINE ARTICOLO:</strong> 5 (da pag. 57 a pag. 61)<br />
<strong>COSTO RIVISTA + CD:</strong> € 6,99<br />
<strong>COSTO RIVISTA + CARTE + CD:</strong> € 9,99</p>
<p>&nbsp;</p>
<p>E ora.. tutti in edicola <img src='http://www.devapp.it/wordpress/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p><strong>Attenzione</strong>: <em>Ricordiamo che gli articoli che pubblichiamo sulla rivista sono in esclusiva per loro, quindi non li vedrete sulle nostre pagine.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.devapp.it/wordpress/ioprogrammo-153-altri-2-articoli-a-cura-di-devapp.html/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>T#064 &#8211; Rilevare le informazioni sul device in uso (modello, nome, sistema, versione)</title>
		<link>http://www.devapp.it/wordpress/t064-rilevare-le-informazioni-sul-device-in-uso-modello-nome-sistema-versione.html</link>
		<comments>http://www.devapp.it/wordpress/t064-rilevare-le-informazioni-sul-device-in-uso-modello-nome-sistema-versione.html#comments</comments>
		<pubDate>Tue, 20 Jul 2010 15:19:17 +0000</pubDate>
		<dc:creator>Staff devAPP</dc:creator>
				<category><![CDATA[Tutorial Pratici]]></category>
		<category><![CDATA[currentDevice]]></category>
		<category><![CDATA[systemName]]></category>
		<category><![CDATA[systemVersion]]></category>
		<category><![CDATA[tutorial iphone]]></category>
		<category><![CDATA[uidevice]]></category>
		<category><![CDATA[Xcode]]></category>

		<guid isPermaLink="false">http://www.devapp.it/wordpress/?p=4051</guid>
		<description><![CDATA[Se lo sviluppo di applicazioni iPhone, per voi, è qualcosa di più di una semplice passione o curiosità e avete intenzione di diffondere il più possibile le vostre applicazioni, dovrete scontrarvi, prima o poi, con le ormai numerose diverse configurazioni &#8220;device/sistema operativo installato&#8221; esistenti. Infatti, se non volete perdere potenziali clienti, dovrete rendere compatibile le]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/t064-uidevice-iphone-sdk-02.jpg"><img src="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/t064-uidevice-iphone-sdk-02.jpg" alt="t064 uidevice iphone sdk 02" title="t064-uidevice-iphone-sdk-02" width="72" height="140" class="alignleft size-full wp-image-4052" /></a> Se lo <strong>sviluppo di applicazioni iPhone</strong>, per voi, è qualcosa di più di una semplice passione o curiosità e avete intenzione di diffondere il più possibile le vostre applicazioni, dovrete scontrarvi, prima o poi, con le ormai numerose diverse configurazioni &#8220;device/sistema operativo installato&#8221; esistenti. Infatti, se non volete perdere potenziali clienti, dovrete rendere compatibile le vostre creazioni con tutte le combinazioni possibili e immaginabili di iPhone/iPod. Pensate ad esempio un iPod Touch 3G con ancora iPhone OS 3.x, o iPhone 4 con iOS 4 o ancora iPhone 3G con iOS 4 e così via. Alcune funzionalità, come ben saprete esistono solo per un dispositivo piuttosto che per un altro (vedi fotocamera) o ancora per una versione di iPhone OS piuttosto che un&#8217;altra (vedi multitasking). Insomma, per ottimizzare al meglio i vostri programmi iPhone dovrete intercettare, quando necessario, alcune informazioni circa il device che sta eseguendo la vostra applicazione e programmare alcune funzionalità in modo diverso per ogni versione o combinazione esistente.<span id="more-4051"></span></p>
<p>Ok, è sicuramente lavoro in più per noi programmatori, ma se non vogliamo perdere clienti e/o ottenere feedback negativi, dovremmo farcene una ragione e studiare bene tutto con calma.<!--more--></p>
<p>Oggi vedremo come sfruttare <strong>UIDevice</strong> per ottenere modello del device, nome, sistema operativo installato e versione. Partiamo subito con questo semplice tutorial.</p>
<p>Apriamo Xcode e creiamo un nuovo progetto. Dall&#8217;elenco dei template disponibili selezioniamo &#8220;View-based Application&#8221; e proseguiamo. Diamo un nome al nostro progetto, ad esempio &#8220;myDevice&#8221;, scegliamo una posizione in cui salvare (sulla scrivania andrà benissimo) e proseguiamo. Apriamo il file &#8220;myDeviceViewController.h&#8221; e dichiariamo 4 UILabel che useremo per mostrare i dati rilevati:</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: #6e371a;">#import &lt;UIKit/UIKit.h&gt;</span>
&nbsp;
<span style="color: #a61390;">@interface</span> myDeviceViewController <span style="color: #002200;">:</span> UIViewController <span style="color: #002200;">&#123;</span>
	IBOutlet UILabel <span style="color: #002200;">*</span>lblModel;
	IBOutlet UILabel <span style="color: #002200;">*</span>lblName;
	IBOutlet UILabel <span style="color: #002200;">*</span>lblSystemName;
	IBOutlet UILabel <span style="color: #002200;">*</span>lblSystemVersion;
<span style="color: #002200;">&#125;</span>
&nbsp;
<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>lblModel;
<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>lblName;
<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>lblSystemName;
<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>lblSystemVersion;
&nbsp;
<span style="color: #a61390;">@end</span></pre></td></tr></table></div>

<p>Niente di complicato insomma, 4 semplici UILabel che grazie a IBOutlet troveremo pronte in Interface Builder per essere collegate ai rispettivi oggetti disegnati graficamente.</p>
<p>Salviamo e facciamo doppio-click sul file &#8220;myDeviceViewController.xib&#8221;, si aprirà quindi Interface Builder che useremo per disegnare la nostra semplicissima interfaccia grafica. Ci occorreranno semplicemente 8 UILabel. Cercate quindi UILabel in Library -> Objects e trascinatene 8 nella View. Quattro le useremo come etichette per indicare cosa verrà visualizzato in quella adiacente. Dovreste ottenere un risultato simile a quello mostrato in figura:</p>
<p><center><br />
<a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/t064-uidevice-iphone-sdk-01.jpg"><img src="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/t064-uidevice-iphone-sdk-01.jpg" alt="t064 uidevice iphone sdk 01" title="t064-uidevice-iphone-sdk-01" width="320" height="502" class="aligncenter size-full wp-image-4053" /></a><br />
</center></p>
<p>Non ci resta che collegare questi oggetti ai rispettivi dichiarati poco fa nel file di interfaccia .h. Per farlo clicchiamo su &#8220;File&#8217;s Owner&#8221; e spostiamoci sul &#8220;Connections Inspector&#8221;, colleghiamo quindi i 4 &#8220;lbl&#8221; con le UILabel appena trascinate. Finiti i collegamenti salviamo e chiudiamo Interface Builder.</p>
<p>A questo punto ci tocca implementare il codice vero e proprio che ci permetterà di mostrare a video (nelle UILabel) i dati del dispositivo che sta eseguendo la nostra applicazione iPhone. Aprite il file &#8220;myDeviceViewController.m&#8221;, aggiungete i rispettivi @synthesize subito dopo l&#8217;istruzione &#8220;@implementation myDeviceViewController&#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> lblModel, lblName, lblSystemName, lblSystemVersion;</pre></td></tr></table></div>

<p>Scommentate quindi il metodo &#8220;viewDidLoad&#8221; e modificatelo come segue:</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;">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>;
&nbsp;
	lblModel.text <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIDevice currentDevice<span style="color: #002200;">&#93;</span> model<span style="color: #002200;">&#93;</span>;
	lblName.text <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIDevice currentDevice<span style="color: #002200;">&#93;</span> name<span style="color: #002200;">&#93;</span>;
	lblSystemName.text <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIDevice currentDevice<span style="color: #002200;">&#93;</span> systemName<span style="color: #002200;">&#93;</span>;
	lblSystemVersion.text <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIDevice currentDevice<span style="color: #002200;">&#93;</span> systemVersion<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Come vedete è tutto molto semplice e non facciamo altro che andare a settare la proprietà &#8220;text&#8221; delle UILabel con il rispettivo valore prelevato tramite [[UIDevice currentDevice] nomeValoreCheCiInteressa];</p>
<p>Questo semplice tutorial si conclude qui, a questo punto sapete come intercettare informazioni sul device in uso, non vi resta che perfezionare le vostre applicazioni e renderle compatibili per tutte le combinazioni di device/sistema esistenti.</p>
<p><center><br />
<a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/t064-uidevice-iphone-sdk-02.jpg"><img src="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/t064-uidevice-iphone-sdk-02.jpg" alt="t064 uidevice iphone sdk 02" title="t064-uidevice-iphone-sdk-02" width="386" height="742" class="aligncenter size-full wp-image-4052" /></a><br />
</center></p>
]]></content:encoded>
			<wfw:commentRss>http://www.devapp.it/wordpress/t064-rilevare-le-informazioni-sul-device-in-uso-modello-nome-sistema-versione.html/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>T#063 &#8211; Inseriamo una navigation bar sulla tastiera stile safari</title>
		<link>http://www.devapp.it/wordpress/t063-inseriamo-una-navigation-bar-sulla-tastiera-stile-safari.html</link>
		<comments>http://www.devapp.it/wordpress/t063-inseriamo-una-navigation-bar-sulla-tastiera-stile-safari.html#comments</comments>
		<pubDate>Mon, 19 Jul 2010 12:29:35 +0000</pubDate>
		<dc:creator>andreaAppCode</dc:creator>
				<category><![CDATA[Tutorial Pratici]]></category>
		<category><![CDATA[Andrea Cappellotto]]></category>
		<category><![CDATA[Interface Builder]]></category>
		<category><![CDATA[navigation bar]]></category>
		<category><![CDATA[tastiera]]></category>
		<category><![CDATA[tutorial Xcode]]></category>

		<guid isPermaLink="false">http://www.devapp.it/wordpress/?p=4036</guid>
		<description><![CDATA[Ciao ragazzi, un po&#8217; di tempo fa vi ho fatto vedere come inserire il tasto &#8220;done&#8221; sulla tastiera numerica, oggi, invece, vedremo come inserire una NavigationBar stile &#8220;Safari&#8221; sulla nostra tastiera. Iniziamo naturalmente con un nuovo progetto di tipo view-based e chiamiamolo &#8220;KeyTab&#8221;. Bene, apriamo il KeyTabViewController.xib e inseriamo un campo di testo. Passiamo quindi]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/t063-navbar-tastiera.jpg"><img src="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/t063-navbar-tastiera.jpg" alt="t063 navigationbar sulla tastiera" title="t063-navbar-tastiera" width="160" height="130" class="alignleft size-full wp-image-4048" /></a> Ciao ragazzi, un po&#8217; di tempo fa vi ho fatto vedere come inserire il tasto &#8220;done&#8221; sulla tastiera numerica, oggi, invece, vedremo come inserire una <em>NavigationBar</em> stile &#8220;Safari&#8221; sulla nostra tastiera.</p>
<p>Iniziamo naturalmente con un nuovo progetto di tipo view-based e chiamiamolo &#8220;KeyTab&#8221;. Bene, apriamo il KeyTabViewController.xib e inseriamo un campo di testo.<span id="more-4036"></span></p>
<p>Passiamo quindi al file di interfaccia KeyTabViewController.h e inseriamo un IBOutlet UITextField :</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: #a61390;">@interface</span> keyTab2ViewController <span style="color: #002200;">:</span> UIViewController &lt;UITextFieldDelegate&gt; <span style="color: #002200;">&#123;</span>
    IBOutlet UITextField <span style="color: #002200;">*</span> txt;
<span style="color: #002200;">&#125;</span>
<span style="color: #a61390;">@end</span></pre></td></tr></table></div>

<p>Aggiungiamo anche il delegato del textField. Torniamo al nostro file .xib e colleghiamo il File&#8217;s Owner con il campo di testo, e il delegato con il campo di testo. (clicchiamo sul file&#8217;s owner tenendo premuto control e colleghiamo le parti).</p>
<p><center><br />
<a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/delegato.png"><img class="alignnone size-medium wp-image-4037" title="delegato" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/delegato-300x187.png" alt="" width="300" height="187" /></a><br />
</center></p>
<p>Passiamo ora all&#8217;implementazione dei metodi. Nel viewDidLoad inseriamo la notifica di quando compare la tastiera:</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;">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>;
&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>keyboardWasShown<span style="color: #002200;">:</span><span style="color: #002200;">&#41;</span>
		name<span style="color: #002200;">:</span>UIKeyboardDidShowNotification object<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Notate che questa volta non abbiamo fatto alcuna differenza per iOS 4 o precedenti, in quanto il procedimento è lo stesso del precedente tutorial.</p>
<p>Bene, ora aggiungiamo il metodo per far tornare la tastiera:</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;">BOOL</span><span style="color: #002200;">&#41;</span>textFieldShouldReturn<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>UITextField <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>textField
<span style="color: #002200;">&#123;</span>
	<span style="color: #002200;">&#91;</span>textField resignFirstResponder<span style="color: #002200;">&#93;</span>;
&nbsp;
	<span style="color: #a61390;">return</span> <span style="color: #a61390;">YES</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Passiamo ora al vero e proprio pezzo fondamentale, l&#8217;inserimento della barra:</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
28
29
30
31
32
33
</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>keyboardWasShown<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSNotification</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>aNotification
<span style="color: #002200;">&#123;</span>
	<span style="color: #400080;">NSDictionary</span> <span style="color: #002200;">*</span>info <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>aNotification userInfo<span style="color: #002200;">&#93;</span>;
    <span style="color: #400080;">NSValue</span> <span style="color: #002200;">*</span>keyBounds <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>info objectForKey<span style="color: #002200;">:</span>UIKeyboardBoundsUserInfoKey<span style="color: #002200;">&#93;</span>;
&nbsp;
    CGRect bndKey;
    <span style="color: #002200;">&#91;</span>keyBounds getValue<span style="color: #002200;">:&amp;</span>bndKey<span style="color: #002200;">&#93;</span>;
&nbsp;
	UIToolbar <span style="color: #002200;">*</span>toolbar <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIToolbar 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: #002200;">-</span><span style="color: #2400d9;">40</span>, bndKey.size.width, <span style="color: #2400d9;">40</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #11740a; font-style: italic;">//[toolbar setTranslucent:YES];</span>
	UIColor <span style="color: #002200;">*</span> black <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIColor alloc<span style="color: #002200;">&#93;</span> initWithRed<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span> green<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span> blue<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span> alpha<span style="color: #002200;">:</span><span style="color: #2400d9;">1.0</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>toolbar setTintColor<span style="color: #002200;">:</span>black<span style="color: #002200;">&#93;</span>;
	UIBarButtonItem <span style="color: #002200;">*</span>barButtonItem <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIBarButtonItem alloc<span style="color: #002200;">&#93;</span> initWithTitle<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Bottone 1&quot;</span> style<span style="color: #002200;">:</span>UIBarButtonItemStyleBordered target<span style="color: #002200;">:</span>self action<span style="color: #002200;">:</span><span style="color: #a61390;">@selector</span><span style="color: #002200;">&#40;</span>buttonClicked<span style="color: #002200;">:</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #400080;">NSArray</span> <span style="color: #002200;">*</span>items <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSArray</span> alloc<span style="color: #002200;">&#93;</span> initWithObjects<span style="color: #002200;">:</span>barButtonItem, <span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>toolbar setItems<span style="color: #002200;">:</span>items<span style="color: #002200;">&#93;</span>;
	<span style="color: #002200;">&#91;</span>items release<span style="color: #002200;">&#93;</span>;
&nbsp;
	UIWindow<span style="color: #002200;">*</span> tempWindow <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>UIApplication sharedApplication<span style="color: #002200;">&#93;</span> windows<span style="color: #002200;">&#93;</span> objectAtIndex<span style="color: #002200;">:</span><span style="color: #2400d9;">1</span><span style="color: #002200;">&#93;</span>;
	UIView<span style="color: #002200;">*</span> keyboard;
	<span style="color: #a61390;">for</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">int</span> i <span style="color: #002200;">=</span> <span style="color: #2400d9;">0</span>; i &lt; <span style="color: #002200;">&#91;</span>tempWindow.subviews count<span style="color: #002200;">&#93;</span>; i<span style="color: #002200;">++</span><span style="color: #002200;">&#41;</span>
	<span style="color: #002200;">&#123;</span>
		<span style="color: #11740a; font-style: italic;">//Get a reference of the current view</span>
		keyboard <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>tempWindow.subviews objectAtIndex<span style="color: #002200;">:</span>i<span style="color: #002200;">&#93;</span>;
&nbsp;
		<span style="color: #11740a; font-style: italic;">//Check to see if the description of the view we have referenced is &quot;UIKeyboard&quot; if so then we found</span>
		<span style="color: #11740a; font-style: italic;">//the keyboard view that we were looking for</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>keyboard description<span style="color: #002200;">&#93;</span> hasPrefix<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;&lt;UIPeripheralHost&quot;</span><span style="color: #002200;">&#93;</span> <span style="color: #002200;">==</span> <span style="color: #a61390;">YES</span><span style="color: #002200;">&#41;</span>
		<span style="color: #002200;">&#123;</span>
			<span style="color: #002200;">&#91;</span>keyboard addSubview<span style="color: #002200;">:</span>toolbar<span style="color: #002200;">&#93;</span>;
		<span style="color: #002200;">&#125;</span>
	<span style="color: #002200;">&#125;</span>
&nbsp;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Alla riga 7 creiamo la nostra UIToolBar, le dimensioni sono state calcolate perfettamente, gli diamo un colore (in questo caso nero). Creiamo poi un bottone, ne possiamo inserire quanti ne vogliamo, e gli diamo come azione il metodo buttonClicked. Nelle prossime due righe non facciamo altro che creare un array, inserirci dentro il bottone e aggiungere il contenuto dell&#8217;array nella barra. In questo caso i bottoni (se ne create più di uno) vi verranno messi tutti in fila, partendo da sinistra. altrimenti potete creare dei bottoni tramite delle viste personalizzate e allora li potete posizionare ovunque.</p>
<p>La parte che segue poi è sempre la stessa, andiamo alla ricerca della vista della tastiera, una volta trovata gli aggiungiamo la barra.</p>
<p>L&#8217;ultima cosa che ci resta da fare è quella di creare il metodo che viene chiamato quando clicchiamo sul bottone:</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>buttonClicked<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSNotification</span> <span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>note
<span style="color: #002200;">&#123;</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;CLICK!!!&quot;</span> message<span style="color: #002200;">:</span><span style="color: #bf1d1a;">@</span><span style="color: #bf1d1a;">&quot;Hai cliccato il bottone sulla tastiera!!&quot;</span> 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>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Ecco qui, quando si clicca su bottone compare un alertView. Spero che i miei brevi tutorial vi siano utili, se volete potete scaricare il progetto da qui:</p>
<p><center><br />
<a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/keyTab2.zip">Progetto KeyTab</a><br />
</center></p>
<p>Eccovi uno screenshot del tutorial in esecuzione:</p>
<p><center><br />
<a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/tastiera.png"><img class="alignnone size-medium wp-image-4039" title="tastiera" src="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/tastiera-156x300.png" alt="" width="156" height="300" /></a><br />
</center></p>
]]></content:encoded>
			<wfw:commentRss>http://www.devapp.it/wordpress/t063-inseriamo-una-navigation-bar-sulla-tastiera-stile-safari.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>L#012 &#8211; Gestione della memoria durante lo sviluppo di applicazioni iPhone e iPad</title>
		<link>http://www.devapp.it/wordpress/l012-gestione-della-memoria-durante-lo-sviluppo-di-applicazioni-iphone-e-ipad.html</link>
		<comments>http://www.devapp.it/wordpress/l012-gestione-della-memoria-durante-lo-sviluppo-di-applicazioni-iphone-e-ipad.html#comments</comments>
		<pubDate>Wed, 14 Jul 2010 12:42:54 +0000</pubDate>
		<dc:creator>Staff devAPP</dc:creator>
				<category><![CDATA[Lezioni Teoriche]]></category>
		<category><![CDATA[alloc]]></category>
		<category><![CDATA[dealloc]]></category>
		<category><![CDATA[gestione memoria]]></category>
		<category><![CDATA[gestione memoria iPhone]]></category>
		<category><![CDATA[init]]></category>
		<category><![CDATA[Memory Leak]]></category>
		<category><![CDATA[release]]></category>
		<category><![CDATA[retain]]></category>
		<category><![CDATA[retainCount]]></category>

		<guid isPermaLink="false">http://www.devapp.it/wordpress/?p=4010</guid>
		<description><![CDATA[Oggi parliamo di gestione della memoria nelle applicazioni iPhone (e iPad). Dopo un primo ottimo articolo sull&#8217;argomento, creato dal nostro Ignazio Calò, abbiamo pensato fosse meglio, viste le numerose richieste, spendere ancora un paio di parole su questo tema di vitale importanza per lo sviluppo di applicazioni per dispositivi mobili come appunto iPhone, iPod Touch]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/XCode_150x150.jpg"><img src="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/XCode_150x150.jpg" alt="Logo Xcode" title="XCode_150x150" width="150" height="150" class="alignleft size-full wp-image-4016" /></a> Oggi parliamo di gestione della memoria nelle applicazioni iPhone (e iPad). Dopo un <a href="http://www.devapp.it/wordpress/l008-%E2%80%93-objective-c-parte-iii.html" target="_blank">primo ottimo articolo</a> sull&#8217;argomento, creato dal nostro Ignazio Calò, abbiamo pensato fosse meglio, viste le numerose richieste, spendere ancora un paio di parole su questo tema di vitale importanza per lo sviluppo di applicazioni per dispositivi mobili come appunto iPhone, iPod Touch e iPad.</p>
<h4>Perchè è così importante la gestione della memoria?</h4>
<p>Gestire la memoria significa prima di tutto evitare di sprecare inutilmente risorse (in questo caso di memoria), che, soprattutto nel caso dei dispositivi mobili, ritroviamo in quantità limitata e non espandibile. Ovviamente gestire la memoria non è solo importante per questo tipo di device, ma anche per le applicazioni desktop, le cui funzionalità potrebbero portare ad occupare enormi quantità di memoria (pensate ad esempio ad applicazioni di tipo scientifico). Quanto mostreremo in questo articolo sarà utile quindi non solo per lo sviluppo di applicazioni iPhone e iPad, ma anche per quello di applicazioni MacOS.<span id="more-4010"></span></p>
<p>Come saprete (o comunque intuirete) ogni variabile, puntatore, oggetto o altro elemento del nostro programma occupa memoria e anche se potrebbero sembrarvi quantità minime, sappiate che l&#8217;apparenza, spesso, inganna. Perchè dico questo? Objective-C (il linguaggio principale con cui lavoriamo) è un linguaggio orientato agli oggetti, e questa potente tecnica di programmazione, come sapete, ci offre funzionalità potentissime, ma allo stesso tempo molto pericolose se non capiamo a fondo il loro principio di funzionamento. Una di queste potenti (e pericolose) caratteristiche è l&#8217;ereditarietà, ovvero la caratteristica che ci permette di creare nuovi oggetti personalizzati, partendo da altri esistenti mantenendo tutte le carattaristiche (proprietà e metodi) dell&#8217;oggetto di partenza.</p>
<p>Ora, come ben saprete la maggior parte del nostro lavoro su iPhone e iPad si basa sul framework Cocoa Touche in particolare dall&#8217;UIKit, offerto da Apple, (<a href="http://www.devapp.it/wordpress/introduzione-al-framework-uikit.html" target="_blank">maggiori informazioni qui</a>) e come potete vedere dal seguente schema esiste una gerarchia specifica per gli oggetti di questo utile kit, in particolare notate come tutti gli oggetti siano derivati di un unico &#8220;super&#8221; oggetto: NSObject.</p>
<p><center><br />
<a href="http://www.devapp.it/wordpress/wp-content/uploads/2009/11/uikit.jpg"><img src="http://www.devapp.it/wordpress/wp-content/uploads/2009/11/uikit.jpg" alt="UIKit" title="uikit" width="345" height="402" class="aligncenter size-full wp-image-802" /></a><br />
</center></p>
<p>Ora immaginiamo un semplice caso, dobbiamo creare una nuova classe con metodi ed eventi personalizzati, che eredita direttamente da NSObject. Analizzando il file di interfaccia della nostra nuova classe, potremmo trovarci di fronte a qualcosa di simile:</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> MyClass<span style="color: #002200;">:</span> <span style="color: #400080;">NSObject</span> <span style="color: #002200;">&#123;</span>
    IBOutlet UITextField <span style="color: #002200;">*</span>myTextField;
<span style="color: #002200;">&#125;</span>
<span style="color: #11740a; font-style: italic;">// Eventuali metodi</span>
<span style="color: #a61390;">@end</span></pre></td></tr></table></div>

<p>Istanziato un oggetto di questa classe, come minimo dovremo aver sufficiente spazio in memoria da allocare per contenere un oggetto UITextField, ma non solo. Dato che questa classe eredita da NSObject, dobbiamo aver spazio sufficiente per contenere anche tutti gli elementi di questo oggetto!</p>
<p>Immaginate ora di creare un nuovo oggetto partendo invece da UITextField, in questo caso dovrete prevedere di aver spazio in memoria per i nuovi elementi e, secondo lo schema sopra, anche per gli elementi di UITextField (da cui ereditate direttamente), ma anche quelli di UIControl (da cui eredita UITextField), UIView (da cui eredita UIControl), UIResponder (da cui eredita UIView) e infine NSObject. Insomma, come potrete intuire le cose si complicano un pochino e di fatto, se pensavate di cavarvela con poca memoria, in realtà ci rendiamo conto che ne serve più del previsto e dovremo allocare la quantità di memoria necessaria a contenere sia i nuovi elemente da noi creati che tutti quelli ereditati. Oltre ad allocare la quantità corretta di memoria, capirete quindi che sarà il caso, inoltre, di liberare appena possibile la memoria utilizzata, ovvero quando l&#8217;oggetto residente in memoria non serve più.  </p>
<p>Insomma, un attenta pianificazione e gestione della memoria può essere decisiva per il successo della vostra applicazione iPhone!</p>
<h4>Allocare la giusta quantità di memoria per un oggetto in Objective-C (alloc, init)</h4>
<p>Allocare la corretta quantità di memoria (ricordate ne che abbiamo una quantità limitata da usare), sembrerebbe quindi un processo lungo e complesso, ma non è così. Il framework, e in particolare proprio il &#8220;super&#8221; oggetto NSObject, ci offre infatti un metodo di classe molto utile: <strong>Alloc</strong>!</p>
<p>Grazie a questo metodo (che potremo usare nei nostri oggetti che ereditano direttamente o indirettamente da NSObject) saremo in grado di allocare la giusta quantità di memoria sia per tutti i nostri nuovi elementi. che per quelli ereditati. A livello di codice è molto semplice, se dovessimo creare nel nostro programma un&#8217;istanza di MyClass, questo potrebbe essere il codice da scrivere:</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;">    MyClass <span style="color: #002200;">*</span>myNewClass <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span>MyClass alloc<span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

<p>L&#8217;istruzione è ancora incompleta, infatti dobbiamo ancora inizializzare il nostro oggetto perchè sia pronto per essere utilizzato all&#8217;interno del nostro programma. Per farlo possiamo sfruttare un altro metodo offerto da NSObject: <strong>init</strong>!<br />
Grazie ad &#8220;init&#8221; potremo appunto inizializzare i nostri oggetti, ovvero dotarlo della configurazione di default che servirà all&#8217;avvio dell&#8217;applicazione (o meglio al momento della creazione dell&#8217;oggeto). Anche qui il codice è molto semplice:</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;">    MyClass <span style="color: #002200;">*</span>myNewClass <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>MyClass alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

<p>Unica cosa che dobbiamo ricordare è che come lo spazio da allocare deve essere calcolato anche per gli elementi degli oggetti da cui si eredita, anche l&#8217;inizializzazione deve essere fatta per questi stessi elementi. Niente paura, anche per questo ci basterà un&#8217;unica riga di codice all&#8217;interno del metodo init nell&#8217;implementazione della nostra classe:</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: #002200;">-</span> <span style="color: #002200;">&#40;</span><span style="color: #a61390;">id</span><span style="color: #002200;">&#41;</span>init <span style="color: #002200;">&#123;</span>
    <span style="color: #002200;">&#91;</span>super init<span style="color: #002200;">&#93;</span>;
    <span style="color: #11740a; font-style: italic;">// Codice per inizializzazione</span>
   <span style="color: #a61390;">return</span> self;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>Grazie all&#8217;istruzione [super init] non ci dovremo preoccupare di inizializzate tutto manualmente.<br />
A questo punto il nostro oggetto &#8220;myNewClass &#8221; è pronto per essere utilizzato.</p>
<h4>Liberare la memoria al momento giusto (retain, release, dealloc)</h4>
<p>Per la creazione del nostro oggetto nel programma è tutto, è infatti stata creata un&#8217;istanza della nostra classe, la abbiamo allocata in memoria (considerando lo spazio necessario) e infine la abbiamo inizializzata a dovere per poterla utilizzare come meglio crediamo. Ovviamente la gestione della memoria non si limita a questo, dovremo infatti prevedere, ad un certo punto, di liberare lo spazio di memoria occupato dalla stessa. NSObject offre un metodo che compie questo lavoro: <strong>dealloc</strong>, questo, però, non dovrà mai essere chiamato esplicitamente, ma dovrà essere chiamato indirettamente dal metodo di protocollo release. Non preoccupatevi se non capite a fondo cosa sto dicendo, ora vedrò di spiegarvi il meccanismo che sta dietro questa frase.</p>
<p>Perchè non possiamo invocare direttamente dealloc? Semplicemente perchè deallocando l&#8217;oggetto sparirebbe dall&#8217;intero programma e potrebbe capitare che in realtà, questo, serva ancora da qualche parte. Infatti oltre a servire nel metodo in cui è chiamato, un oggetto potrebbe essere passato come argomento ad altro oggetto e avere ancora uno scopo che necessiti la sua esistenza. Deallocandolo in un caso come questo il programma restituirebbe un errore o comunque si comporterebbe in modo anomalo e imprevisto. </p>
<p>Da qui nasce l&#8217;esigenza avere un contatore che indichi al nostro programma se esiste ancora qualcuno interessato ad sfruttare il nostro oggetto. Questo contatore dovrà avere valore 1 non appena l&#8217;oggetto verrà allocato in memoria, dovrà quindi essere incrementato di 1 ogni volta che un altro oggetto ha interesse a mantenerlo in memoria, e diminuito di 1 quando un oggetto decide che non gli serve più. </p>
<p>Anche in questo caso non dovremmo inventarci nulla in quanto in nostro aiuto arriva il nostro caro NSObject, che offre ad ogni oggetto da esso ereditato una proprietà chiamata <strong>retainCount</strong>. Quando retainCount varrà 0, <em>dealloc</em> verrà richiamato in automatico e la memoria sarà liberata.</p>
<p>Come detto allocando un oggetto in memoria verrà impostato il suo <em>retainCount</em> a 1, noi dovremo semplicemente dire al programma di sottrargli un 1 quando non ci servirà più, per farlo useremo il metodo <em>release</em>:</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;">MyClass <span style="color: #002200;">*</span>myNewClass <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>MyClass alloc<span style="color: #002200;">&#93;</span> init<span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #11740a; font-style: italic;">// Facciamo qualcosa con la nostra myNewClass</span>
&nbsp;
<span style="color: #002200;">&#91;</span>myNewClass release<span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

<p>In particolare riportiamo i momenti in cui <em>retainCount</em> può variare (tratti dal nostro <a href="http://www.devapp.it/wordpress/l008-%E2%80%93-objective-c-parte-iii.html" target="_blank">precedente articolo</a> su questo tema a cura di Ignazio Calò):</p>
<ul>
<li>Quando una variabile viene inizializzata il suo retainCount viene incrementato di 1.</li>
<li>I metodi alloc, copy, allocWithZone incrementano retainCount di 1.</li>
<li>I metodi release, autorelease decrementano retainCount di 1. (autorelease lo fa in un momento non deterministico)</li>
<li>Se non diversamente specificato il metodo autorelease viene invocato di default.</li>
</ul>
<h4>Casi particolari</h4>
<p>Ora, senza entrare troppo nel dettaglio, sappiate che esistono alcuni casi in cui possiamo usare un oggetto senza allocarlo o deallocarlo, semplicemente il tutto viene gestito in automatico e gli oggetti vengono rilasciati quando non servono più.</p>
<p>Vediamo un esempio:</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: #400080;">NSString</span> <span style="color: #002200;">*</span>myNewString <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;Nuova stringa&quot;</span><span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

<p>In questo caso stiamo utilizzando il metodo di classe &#8220;stringWithFormat&#8221; (quelli che iniziano con + per intenderci), per questo tipo di metodi non dovremo preoccuparci di nulla e potremo utilizzare questi oggetti senza troppi pensieri.</p>
<h4>Errori nella gestione della memoria</h4>
<p>Per concludere vediamo cosa comporta non gestire correttamente la memoria durante lo sviluppo di un&#8217;applicazione iPhone, iPad e anche Mac. Se allochiamo un oggetto, dedichiamo quindi ad esso uno spazio in memoria, ma ci dimentichiamo per qualche ragione di rilasciarlo, questo occuperà per tutta la durata dell&#8217;esecuzione del programma quello spazio in memoria, e ogni volta che richiameremo una nuova istanza dell&#8217;oggetto, un altro pezzettino di memoria andrà occupato inutilmente. Capirete che pian piano, la memoria disponibile (ricordiamo che sui dispositivi mobili è limitata in modo considerevole rispetto agli ambienti desktop), andrà ad esaurirsi fino al blocco del programma stesso o al verificarsi di comportamenti anomale e imprevisti. Questo tipo di errore nella gestione della memoria è chiamato <strong>Memory Leak</strong>.</p>
<p>Per farvi comprendere meglio cosa significa incappare in questo errore vi riportiamo, per semplicità e comodità, e vista inoltre l&#8217;immediatezza e la chiarezza di quanto illustrato, un breve esempio <a href="http://it.wikipedia.org/wiki/Memory_leak" target="_blank">tratto da wikipedia</a>:</p>
<blockquote><p>
<em>Questo esempio vuole dimostrare come un leak può nascere, ed i suoi effetti, senza dover conoscere le basi della programmazione. Questo è solo un esempio fittizio.</p>
<p>Il programma in questione fa parte di un software molto semplice dedicato al controllo di un ascensore. Questa porzione di algoritmo viene eseguita ogni volta che qualcuno all&#8217;interno preme un bottone.</p>
<p>Quando il bottone viene premuto:</p>
<ul>
<li>recupera un po&#8217; di memoria per ricordare il piano richiesto</li>
<li>metti il numero richiesto in memoria</li>
<li>siamo già al piano giusto?</li>
<li>se sì, non dobbiamo fare niente: finito</li>
<li>altrimenti, aspetta finché l&#8217;ascensore è disponibile</li>
<li>vai al piano richiesto</li>
<li>rilascia la memoria usata per ricordare il numero del piano</li>
</ul>
<p>Questo programma potrebbe sembrare corretto, ma contiene un leak. Consideriamo il caso in cui l&#8217;ascensore si trova al piano 3 e premiamo il bottone 3. Otteniamo un po&#8217; di memoria che non restituiremo mai. Ogni volta che succede perdiamo un po&#8217; di memoria.</p>
<p>Questo problema non avrà un effetto immediato. Le persone non premono il bottone di un piano su cui stanno, ed in ogni caso ci può essere abbastanza memoria da gestire questa situazione centinaia o migliaia di volte. Ma alla fine la memoria finirà. Potrebbe richiedere mesi o anni, o potrebbe non essere mai scoperto.</p>
<p>Le conseguenze potrebbero essere sgradevoli; alla fine l&#8217;ascensore smetterebbe di funzionare. Se il programma avesse bisogno di memoria per aprire le porte, qualcuno potrebbe restare intrappolato all&#8217;interno, visto che non abbiamo risorse per aprirle.</p>
<p>Bisogna notare che il memory leak aumenta finché il programma è in esecuzione. Ad esempio, se un calo di elettricità blocca l&#8217;ascensore, al ritorno dell&#8217;alimentazione la memoria sarà completamente disponibile ed il lento processo di perdita di memoria deve ricominciare da zero.</em>
</p></blockquote>
<p>Questo articolo non può certo considerarsi esaustivo sull&#8217;argomento, ma speriamo di aver tolto qualche dubbio in più e di invogliarvi, vista l&#8217;importanza, ad approfondire questo &#8220;apparentemente noioso&#8221; argomento.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.devapp.it/wordpress/l012-gestione-della-memoria-durante-lo-sviluppo-di-applicazioni-iphone-e-ipad.html/feed</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Gestione dei file nelle nostre applicazione iPhone</title>
		<link>http://www.devapp.it/wordpress/gestione-dei-file-nelle-nostre-applicazione-iphone.html</link>
		<comments>http://www.devapp.it/wordpress/gestione-dei-file-nelle-nostre-applicazione-iphone.html#comments</comments>
		<pubDate>Sun, 11 Jul 2010 10:12:24 +0000</pubDate>
		<dc:creator>iMorph</dc:creator>
				<category><![CDATA[Guide e Manuali]]></category>
		<category><![CDATA[cinaglia pietro]]></category>
		<category><![CDATA[createFileAtPath]]></category>
		<category><![CDATA[directory iphone]]></category>
		<category><![CDATA[directoryContentsAtPath]]></category>
		<category><![CDATA[fileExistsAtPath:isDirectory]]></category>
		<category><![CDATA[gestione file iPhone]]></category>
		<category><![CDATA[i/o xcode]]></category>
		<category><![CDATA[iphone sdk]]></category>
		<category><![CDATA[NSFileManager]]></category>
		<category><![CDATA[NSOutputStream]]></category>
		<category><![CDATA[tutorial Xcode]]></category>

		<guid isPermaLink="false">http://www.devapp.it/wordpress/?p=3996</guid>
		<description><![CDATA[Uno sguardo su come leggere/creare file e directory utilizzando il concetto di flusso di byte e i metodi delle classi messe a disposizione dalla iPhone SDK...]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/gestione-file-applicazioni-iphone-devapp.png"><img src="http://www.devapp.it/wordpress/wp-content/uploads/2010/07/gestione-file-applicazioni-iphone-devapp.png" alt="gestione file applicazioni iphone devapp" title="gestione-file-applicazioni-iphone-devapp" width="135" height="114" class="alignleft size-full wp-image-4003" /></a> La gestione di file è una caratteristica di primaria importanza nelle applicazioni che intendono salvare il proprio stato o esportare i loro contenuti (generalmente in forma testuale).</p>
<p>A causa delle restrizioni imposte per motivi di sicurezza sull&#8217; iPhoneOS non è possibile vedere l&#8217;intero filesystem ma solo ciò che è all&#8217;interno del filesystem riservato alla vostra applicazione (sandbox), ciò porta all&#8217;impossibilità di usufruire direttamente dei dati utente (musica, video) o delle altre applicazioni.</p>
<p>Innanzitutto è importante conoscere il contenuto della home-directory comune a tutte le applicazioni in modo da tenere &#8220;in ordine&#8221; i file della nostra app&#8230;</p>
<p><span id="more-3996"></span></p>
<p>L&#8217;home-directory è composta generalmente da quattro principali directory:</p>
<ul>
<li><em>NomeApplicazione</em>: ha il nome dell&#8217;applicazione e contiene eseguibile, NIB, localizzazioni, ecc&#8230; (non potete effettuare operazioni di I/O)</li>
<li><em>&#8220;Library&#8221;</em>: è la cartella genitore di <em>&#8220;Preferences&#8221;</em> e la lettura/scrittura avviene attraverso l&#8217;uso delle API</li>
<li><em>&#8220;Documents&#8221;</em>: di default è vuota ed è gestibile a proprio piacimento</li>
<li><em>&#8220;tmp&#8221;</em>: come suggerisce il nome è la cartella dei file temporanei, potrete utilizzarla a vostro piacimento ma è importante ricordare che non viene presa in considerazione da iTunes e che bisogna ricordarsi di svuotarne il contenuto (buona norma è svutarlo alla chiusura dell&#8217;app)</li>
</ul>
<p>Un consiglio di particolare importanza è quello di lasciar perdere le prime due directory e utilizzare solo le altre&#8230;</p>
<p>Ora passiamo a parlare un po più nella pratica di come potrà avvenire l&#8217;accesso al filesystem; per lo scopo utilizzeremo la classe <em><strong><a href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSFileManager_Class/Reference/Reference.html" target="_blank">NSFileManager</a></strong></em> (per maggiori info vi rimando alla documentazione ufficiale).</p>
<h4>Visualizzare il contenuto di una directory</h4>
<p>Per lo scopo useremo la classe <em><strong>NSFileManager</strong></em> e il suo metodo <strong>directoryContentsAtPath:</strong><br />
Questo ha come ritorno la lista dei nomi di file e directory nel percorso dato, questi sono restituiti all&#8217;interno di un NSArray di NSString.<br />
<em>Il consiglio è di utilizzare una UITableView che avrà come lunghezza la dimensione dell&#8217;array e come contenuto l&#8217;array stesso (i-esima cella =&gt; i-esimo elemento dell&#8217;NSArray).</em></p>
<h4>Attributi di un file</h4>
<p>Precedentemente abbiamo visto come ottenere il contenuto di una precisa directory ma, come avrete sicuramente notato, file e cartelle non sono distinguibili in quanto rappresentate entrambe una una NSString contenente il loro nome. Appunto per questo ricorreremo al metodo <strong><em>fileExistsAtPath:isDirectory:</em> </strong>(sempre di <em>NSFileManager</em>), <em>isDirectory</em> è un puntatore a un boolean (BOOL) che avrà i valori YES se il percorso è una directory.</p>
<h4>Lettura di un file</h4>
<p>Per la lettura di un file ci rifaremo al concetto di flusso che considera i byte del file all&#8217;interno di uno stream che viene sequenzialmente letto (in questo modo non dovremmo necessariamente caricare tutto il file in memoria e perciò avremo evitato di dover leggere solo file di piccole dimensioni).</p>
<p>La classe che andremo ad utilizzare sarà una sottoclasse di<em><strong> <a href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Classes/NSStream_Class/Reference/Reference.html" target="_blank">NSStream</a></strong></em> denominata <em><strong>NSInputStream</strong></em>.</p>
<p>Possiamo riassumere le operazioni da eseguire in:</p>
<ul>
<li>creare un buffer di memoria contenente i byte letti dal flusso (stream);</li>
<li>leggere ciclicamente (es. con un ciclio <em>while</em>) i blocchi di byte (con dimensione inferiore alla dimensione del flusso);</li>
<li>operare sui byte (per esempio scriverli di seguito in un UITextView dopo averli opportunamente convertiti in stringhe);</li>
<li>chiudere il flusso quando i byte sono terminati.</li>
</ul>
<p>L&#8217;esempio del terzo punto è proprio quello che andremo ad affrontare&#8230;</p>
<p>Come riportiamo i byte nel UITextView ?</p>
<p>Penso che un codice esprima molto più di 1000 parole:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</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> appendText<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> text <span style="color: #002200;">&#123;</span>
textView.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;%@%@&quot;</span>, textView.text, text<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p>La stringa in rosso rappresenta ciò che dobbiamo aggiungere mentre <em>textView.text</em> è il testo dell&#8217;UITextView.</p>
<p>Naturalmente non possiamo dare in input al metodo direttamente il blocco di byte letto ma dobbiamo prima convertirlo, anche in questo caso riporteremo la parte di codice necessria all&#8217;operazione:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>bufferString <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSString</span> alloc<span style="color: #002200;">&#93;</span> initWithBytesNoCopy<span style="color: #002200;">:</span>buffer length<span style="color: #002200;">:</span>bufferLength encoding<span style="color: #002200;">:</span>NSUTF8StringEncoding freeWhenDone<span style="color: #002200;">:</span> <span style="color: #a61390;">NO</span><span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>self appendText<span style="color: #002200;">:</span>bufferString<span style="color: #002200;">&#93;</span>;</pre></td></tr></table></div>

<p><em>&#8220;<span style="color: #ff0000;">bufferString</span>&#8221; </em>sarà il testo in input ad <em>appendText</em> (che nel metodo in questione chiamiamo semplicemente <span style="color: #ff0000;"><em>text</em></span>) mentre <span style="color: #008000;"><em>buffer</em></span> sarà il gruppo di byte letti.</p>
<p><em>NSUTF8StringEncoding </em>è utilizzabile solo per file di testo semplici.</p>
<h4>Creazione e Scrittura di un file</h4>
<p>Per la creazione del file useremo <em><strong>createFileAtPath:</strong></em> di <em>NSFileManager.</em></p>
<p>Per la scrittura di questo useremo il concetto di flusso ma invece che considerarlo in input sarà in output (cioè verso il file creato); per questo scopo useremo il metodo <em><strong>write:maxLength:</strong></em> di <strong><em>NSOutputStream</em></strong> (sottoclasse di <em>NSStream</em>).</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
</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> createAndSave <span style="color: #002200;">&#123;</span>
&nbsp;
<span style="color: #002200;">&#91;</span>asyncOutputStream release<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>outData release<span style="color: #002200;">&#93;</span>;
&nbsp;
outData <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span>textView.text dataUsingEncoding<span style="color: #002200;">:</span> NSUTF8StringEncoding<span style="color: #002200;">&#93;</span> retain<span style="color: #002200;">&#93;</span>;
&nbsp;
outRange.location <span style="color: #002200;">=</span> <span style="color: #2400d9;">0</span>;
&nbsp;
<span style="color: #400080;">NSString</span> <span style="color: #002200;">*</span>newFile <span style="color: #002200;">&#91;</span>parentDirectoryPath
stringByAppendingPathComponent<span style="color: #002200;">:</span> fileName.text<span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSFileManager</span> defaultManager<span style="color: #002200;">&#93;</span> &lt;strong&gt;createFileAtPath&lt;<span style="color: #002200;">/</span>strong&gt;<span style="color: #002200;">:</span>newFile contents<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span> attributes<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span>;
&nbsp;
asyncOutputStream <span style="color: #002200;">=</span> <span style="color: #002200;">&#91;</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSOutputStream</span> alloc<span style="color: #002200;">&#93;</span> initToFileAtPath<span style="color: #002200;">:</span> newFIle append<span style="color: #002200;">:</span> <span style="color: #a61390;">NO</span><span style="color: #002200;">&#93;</span>;
&nbsp;
<span style="color: #002200;">&#91;</span>asyncOutpuntStream setDelegate<span style="color: #002200;">:</span> self<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>asyncOutpuntStream scheduleInRunLoop<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span><span style="color: #400080;">NSRunLoop</span> runLoop<span style="color: #002200;">&#93;</span> forMode<span style="color: #002200;">:</span> NSDefaultRunLoopMode<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#91;</span>asyncOutpuntStream open<span style="color: #002200;">&#93;</span>;
<span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p><em><span style="color: #0000ff;">textView</span></em> sarà UITextView che conterrà il testo del file</p>
<p><em><span style="color: #ff0000;">fileName</span></em> sarà UITextField che conterrà il nome del file</p>
<p><em><strong>asyncOutputStream</strong></em> indica che il flusso dei dati avviene in maniera asincrona (ciò può avvenire anche nel caso della lettura); in questo modo l&#8217;app non resta in blocco per tutta la durata del flusso ma opera solo quando il flusso ha dei byte disponibili.</p>
<p><em><strong>outData</strong></em> conterrà il testo dell&#8217;UITextView convertito in NSData in modo da essere compatibile con il flusso<br />
Nel file header (.h) saranno necessarie le variabili d&#8217;istanza:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="objc" style="font-family:monospace;"><span style="color: #400080;">NSData</span> <span style="color: #002200;">*</span>outData;
<span style="color: #a61390;">NSRange</span> <span style="color: #002200;">*</span>outRange;
<span style="color: #400080;">NSOutputStream</span> <span style="color: #002200;">*</span>asyncOutputStream;</pre></td></tr></table></div>

<p>Queste servono per coordinare il metodo e il callback&#8230;</p>
<p>E&#8217; importante ricordare che la scrittura nel flusso genererà degli eventi, i più importanti sono:</p>
<ul>
<li><em><strong>NSStreamEventHasSpaceAvaible:</strong></em> indica che il flusso è pronto</li>
<li><em><strong>NSStreamEventErrorOccurred</strong></em>: indica che si è verificato un errore (potete ad esempio visualizzare un <em>UIAlertView</em>)</li>
</ul>
<p>Quando il primo caso si verificherà siamo pronti  a impostare il buffer da passare a <em>write:maxLength</em> di <em>NSOutputStream</em></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>outputStream write<span style="color: #002200;">:</span> buffer maxLength<span style="color: #002200;">:</span> <span style="color: #2400d9;">1</span><span style="color: #002200;">&#93;</span></pre></td></tr></table></div>

<p>in questo caso la lunghezza è pari a 1 ma può essere modificata.</p>
<p><em>outputStream</em> è il nostro NSOuputStream:</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: #400080;">NSOutputStream</span> <span style="color: #002200;">*</span>outputStream <span style="color: #002200;">=</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSOutputStream</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span> stream;</pre></td></tr></table></div>

<p>Mentre <em>stream</em> è un NSStream* in input:</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;">-</span><span style="color: #002200;">&#40;</span><span style="color: #a61390;">void</span><span style="color: #002200;">&#41;</span>stream<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSStream</span><span style="color: #002200;">*</span><span style="color: #002200;">&#41;</span>stream handelEvent<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>NSStreamEvent<span style="color: #002200;">&#41;</span>event <span style="color: #002200;">&#123;</span> ... <span style="color: #002200;">&#125;</span></pre></td></tr></table></div>

<p style="text-align: right;">
<p style="text-align: right;"><em>Buona programmazione a tutti e arrivederci al prossimo articolo&#8230;</em></p>
<p style="text-align: right;"><strong><em>Cinaglia Pietro</em></strong><em><strong> </strong></em></p>
<p style="text-align: right;"><em><strong> </strong><a href="http://www.unicz.net/blog" target="_blank"><img class="alignnone" title="www.unicz.net/blog" src="http://www.unicz.net/blog/mini-banner.png" alt="www.unicz.net/blog" width="126" height="44" /></a><br />
</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.devapp.it/wordpress/gestione-dei-file-nelle-nostre-applicazione-iphone.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
