<?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>Pianeta Apple &#187; Dev</title>
	<atom:link href="http://www.pianeta-apple.it/sezione/dev/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.pianeta-apple.it</link>
	<description>Mac, iPhone, iPad, iPod ed Hi-tech</description>
	<lastBuildDate>Thu, 21 Jun 2012 12:13:53 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>Chords Archiver: accordi e lyrics su iPad</title>
		<link>http://www.pianeta-apple.it/2011/06/23/chords-archiver-accordi-e-lyrics-su-ipad/</link>
		<comments>http://www.pianeta-apple.it/2011/06/23/chords-archiver-accordi-e-lyrics-su-ipad/#comments</comments>
		<pubDate>Thu, 23 Jun 2011 10:18:05 +0000</pubDate>
		<dc:creator>Pianeta Apple</dc:creator>
				<category><![CDATA[Applicazioni per iPad]]></category>
		<category><![CDATA[Dev]]></category>
		<category><![CDATA[Primo piano]]></category>
		<category><![CDATA[Ultime notizie]]></category>

		<guid isPermaLink="false">http://www.pianeta-apple.it/?p=1433</guid>
		<description><![CDATA[Chords Archiver è una applicazione gratuita, sviluppata da un giovane programmatore italiano, Davide Troise. Chords Archiver è sostanzialmente un archiviatore di accordi e testi di canzoni, con alcune ottimizzazioni per l’utilizzo durante le performance live. L&#8217;autore ha approntato anche un pagina di supporto che ne spiega il funzionamento e le caratteristiche principali. Chord Archiver permette [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.pianeta-apple.it/wp-content/uploads/2011/06/chords_archiver_webicon.png"><img class="alignleft size-full wp-image-1434" title="chords_archiver_webicon" src="http://www.pianeta-apple.it/wp-content/uploads/2011/06/chords_archiver_webicon.png" alt="" width="200" height="198" /></a></p>
<p><a href="http://itunes.apple.com/it/app/chords-archiver/id437294974?mt=8">Chords Archiver</a> è una applicazione gratuita, sviluppata da un giovane programmatore italiano, <a href="http://apps.troise.net">Davide Troise</a>.</p>
<p>Chords Archiver è sostanzialmente un archiviatore di accordi e testi di canzoni, con alcune ottimizzazioni per l’utilizzo durante le performance live.</p>
<p>L&#8217;autore ha approntato anche un <a href="http://apps.troise.net/it/chords_archiver.html" class="broken_link">pagina di supporto</a> che ne spiega il funzionamento e le caratteristiche principali.</p>
<p>Chord Archiver permette archiviare le tue canzoni (con testo, accordi e tablature) a mano o cercandole su internet con Safari, per poi salvarle nell&#8217;applicazione.</p>
<p>Le canzoni sono ordinate per autore, in sezioni alfabetiche ed è implementata una ricerca su tutto il testo per aiutarti a trovare facilmente una canzone.</p>
<p><a href="http://www.pianeta-apple.it/wp-content/uploads/2011/06/foto-1.png"><img src="http://www.pianeta-apple.it/wp-content/uploads/2011/06/foto-1-480x360.png" alt="" title="foto 1" width="480" height="360" class="aligncenter size-medium wp-image-1435" /></a></p>
<p><strong>I preferiti.</strong> Puoi segnare le tue canzoni preferite con una stella. Queste canzoni sono visualizzate in un menu dedicato a destra in cui puoi decidere l&#8217;ordine di tali canzoni creando una vera e propria scaletta per le tue esibizioni dal vivo!<br />
Per sfogliare i preferiti avanti e indietro in maniera immediata, hai bisogno di un solo dito: scorri a destra o a sinistra sul display per cambiare canzone a seconda della lista dei preferiti.<br />
<a href="http://www.pianeta-apple.it/wp-content/uploads/2011/06/foto-3.png"><img src="http://www.pianeta-apple.it/wp-content/uploads/2011/06/foto-3-270x360.png" alt="" title="foto 3" width="270" height="360" class="aligncenter size-medium wp-image-1436" /></a></p>
<p><strong>Autoscroll e grandezza del carattere.</strong> Le canzoni lunghe hanno testo e accordi lunghi: con lo scroll automatico puoi scorrerli senza toccare il display. Puoi anche cambiare la grandezza del font e la velocità di scorrimento del testo: Chord Archiver si ricorda questi parametri per ogni canzone.</p>
<p>L&#8217;applicazione è localizzata in italiano e inglese.</p>
<p>L&#8217;autore, che fa anche parte della nostra Redazione, ci tiene a incoraggiare commenti, suggerimenti e critiche al fine di migliorare questa che è la sua prima applicazione per iPad.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pianeta-apple.it/2011/06/23/chords-archiver-accordi-e-lyrics-su-ipad/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Progettare un inizializzatore designato con argomenti</title>
		<link>http://www.pianeta-apple.it/2010/12/24/progettare-un-inizializzatore-designato-con-argomenti/</link>
		<comments>http://www.pianeta-apple.it/2010/12/24/progettare-un-inizializzatore-designato-con-argomenti/#comments</comments>
		<pubDate>Fri, 24 Dec 2010 06:00:45 +0000</pubDate>
		<dc:creator>Pianeta Apple</dc:creator>
				<category><![CDATA[Primo piano]]></category>
		<category><![CDATA[Tip Xcode]]></category>

		<guid isPermaLink="false">http://www.pianeta-apple.it/?p=1394</guid>
		<description><![CDATA[In Objective-C il metodo standard per inizializzare un oggetto è certamente init. Se vogliamo, il metodo init può essere riscritto secondo le nostre esigenze. Possiamo infatti semplicemente reimplementarlo, sovrascrivendo il metodo originario, cioè quello ereditato dal padre della classe (che sia NSObject o qualche altro). Ma se ci serve un metodo di inizializzazione che accetti [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.pianeta-apple.it/wp-content/uploads/2010/12/Xcode-initWith.jpg"><img class="aligncenter size-full wp-image-1395" title="Xcode-initWith" src="http://www.pianeta-apple.it/wp-content/uploads/2010/12/Xcode-initWith.jpg" alt="" width="495" height="279" /></a><br />
In Objective-C il metodo standard per inizializzare un oggetto è certamente <code>init</code>. Se vogliamo, il metodo init può essere riscritto secondo le nostre esigenze. Possiamo infatti semplicemente reimplementarlo, sovrascrivendo il metodo originario, cioè quello ereditato dal padre della classe (che sia <em>NSObject</em> o qualche altro). Ma se ci serve un metodo di inizializzazione che accetti degli argomenti, siamo costretti a scriverne uno nuovo (ovviamente se non è già previsto dalla classe da cui ereditiamo). Ad esempio potremmo scrivere:</p>
<pre class="brush: objc;">
-(id)initWithFloat:(float)newFloat
{
	[super init];
	storedFloat = newFloat;
	return self;
}
</pre>
<p>seguendo l&#8217;utile convenzione sui nomi che prevedere, in questo caso, di iniziare il nome del metodo con <em>init</em>, poi segnalare la presenza di uno o più argomenti con la parola <em>With</em>, ed infine scrivendo il nome del primo argomento. Dal secondo il poi si aggiungerebbe la congiunzione <em>and</em>.</p>
<p>Dal punto di vista progettuale, in questo modo l’oggetto della classe che contiene questo nuovo metodo è inzializzato con la variabile di istanza <code>storedFloat</code> impostata al valore dell’argomento. E possiamo allocare un’istanza della classe e inizializzarla con tanto di argomento, tutto in una sola riga di codice:</p>
<pre class="brush: objc; light: true;">myNumber *aNumber = [[myNumber alloc] initWithFloat:4.92131];</pre>
<p>Un problema nasce quando qualcun altro potrebbe usare ancora il metodo <code>init</code> che, essendo ereditato quantomeno da <em>NSObject</em>, non è eliminabile ma non inizializza l’oggetto come vorremmo.</p>
<p>La soluzione è aggiungere il metodo init nell’implementazione della nostra classe, in modo che vada a sovrascrivere il metodo ereditato, e scrivere</p>
<pre class="brush: objc; light: true;">-(id)init
{
	return [self initWithFloat:4.92131];
}</pre>
<p>senza la necessità di richiamare <code>[super init]</code> dal momento che lo fa già initWithFloat.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pianeta-apple.it/2010/12/24/progettare-un-inizializzatore-designato-con-argomenti/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oggetti: come negare la responsabilità con autorelease</title>
		<link>http://www.pianeta-apple.it/2010/12/17/oggetti-come-negare-la-responsabilita-con-autorelease/</link>
		<comments>http://www.pianeta-apple.it/2010/12/17/oggetti-come-negare-la-responsabilita-con-autorelease/#comments</comments>
		<pubDate>Fri, 17 Dec 2010 06:00:06 +0000</pubDate>
		<dc:creator>Pianeta Apple</dc:creator>
				<category><![CDATA[Primo piano]]></category>
		<category><![CDATA[Tip Xcode]]></category>

		<guid isPermaLink="false">http://www.pianeta-apple.it/?p=1371</guid>
		<description><![CDATA[Abbiamo iniziato a parlare di oggetti e memoria in un primo articolo sui metodi alloc e init, proseguendo con una breve discussione dei problemi dovuti al memory leak. Oggi andiamo avanti su questo tema e partiamo subito ricordando che gli oggetti non vengono mai deallocati dall’utente ma viene utilizzato il contatore di retain. Quando un [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.pianeta-apple.it/wp-content/uploads/2010/12/autorelease-xcode.jpg"><img class="aligncenter size-full wp-image-1373" title="autorelease-xcode" src="http://www.pianeta-apple.it/wp-content/uploads/2010/12/autorelease-xcode.jpg" alt="" width="495" height="278" /></a></p>
<p>Abbiamo iniziato a parlare di oggetti e memoria in un primo articolo sui <a href="http://www.pianeta-apple.it/2010/12/03/tip-oggetti-e-gestione-della-memoria/">metodi alloc e init</a>, proseguendo con una breve discussione dei problemi dovuti al <a href="http://www.pianeta-apple.it/2010/12/10/oggetti-non-deallocati-e-la-perdita-di-memoria/">memory leak</a>. Oggi andiamo avanti su questo tema e partiamo subito ricordando che gli oggetti non vengono mai deallocati dall’utente ma viene utilizzato il contatore di retain.</p>
<p>Quando un oggetto viene allocato il suo contatore di <code>retain</code> è impostato automaticamente a 1, e viene incrementato ogni volta che in una parte di codice si dichiara l’interesse a quell’oggetto. Viceversa, quando l’oggetto non serve più, viene chiamato il metodo <code>release</code>, che decrementa il contatore di 1 finché, arrivato a zero, l’oggetto viene deallocato automaticamente dal sistema.</p>
<p>È più facile di quel che sembra e, una volta iniziato in concreto ad usare questo sistema, sarà ancora più facile. Ma esistono dei casi in cui tutta questa responsabilità per un oggetto non è così comoda da avere. Ecco un esempio.</p>
<p>Data una classe che potremmo chiamare <code>MyNumber</code>, consideriamo un metodo che restituisca il numero registrato (<code>theNumber</code>, che supponiamo sia un <code>float</code>) come oggetto <code>NSString</code>. Nel file .h scriveremo quindi</p>
<pre class="brush: objc; light: true;">-(NSString *)theNumberAsString;</pre>
<p>Nell’implementazione (ovvero il file .m) dovremo allocare un nuovo oggetto <code>NSString</code>, dal momento che deve essere restituito, basato sul valore della variabile <code>theNumber</code> che è di tipo <code>float</code>. Per fare questo usiamo il metodo <code>initiWithFormat</code>.</p>
<p>Se però scrivessimo tale implementazione come</p>
<pre class="brush: objc; light: true;">-(NSString *)theNumberAsString
{
NSString *theString = [[NSString alloc] initWithFormat:@&quot;%f&quot;, theNumber];

return theString;
}</pre>
<p>potremmo pensare di dover rilasciare la variabile <code>theString</code>, scrivendo il comando <code>[theString release]</code> prima della riga <code>return</code>. Ma a questo punto restituiremmo un oggetto non più allocato, generando un ovvio errore.</p>
<p>Il problema è però che non vogliamo dover rilasciare un oggetto in un metodo in cui non lo abbiamo allocato, quindi, ad esempio, non vogliamo rilasciare la <code>NSString</code> <code>theString</code> nel metodo che richiama <code>theNumberAsString</code>, in qualunque parte del codice si trovi.</p>
<p>Se infatti dovessimo scrivere un metodo così</p>
<pre class="brush: objc; light: true;">{
MyNumber *aNumber = [[MyNumber alloc] init];

[aNumber setTheNumber:3];

NSString *aNumberString = [aNumber theNumberAsString];

/* ... codice che usa aNumberString ... */

[anumberString release];
}</pre>
<p>allora saremmo costretti ad avvisare tutti coloro volessero usare l’istanza <code>*aNumber</code> di rilasciare qualunque stringa theString a cui abbia avuto accesso tramite il metodo <code>theNumberAsString</code>.</p>
<p>Fortunatamente il framework <em>Cocoa</em>, che ha preparato per noi <em>Apple</em>, risolve questa complicazione con il <em>meccanismo dell&#8217;autorilascio</em>: ovvero il comando autorelease.</p>
<p><code>Autorelease</code>, infatti, rilascia automaticamente tutti gli oggetti non utilizzati quando il programma resta in attesa che l’utente faccia qualcosa, ovvero alla successiva esecuzione del ciclo degli eventi. Se a quel punto l’oggetto ha un conteggio dei riferimenti uguale a zero, sarà deallocato automaticamente, come prevedibile.</p>
<p>Quindi il codice da modificare è quello nell’implementazione di theNumberAsString:</p>
<pre class="brush: objc; light: true;">-(NSString *)theNumberAsString
{
NSString *theString = [[NSString alloc] initWithFormat:@&quot;%f&quot;, theNumber];

return [theString autorelease];
}</pre>
<p>In questo modo la stringa <code>theString</code> viene rilasciata solo alla fine del codice corrente. La conseguenza è che se generiamo stringhe in un metodo che usa <code>theNumberAsString</code> non dobbiamo più preoccuparci di rilasciarle, perché sono allocate in <code>theNumberAsString</code> e verrà utilizzato per loro l’autorilascio. Nel file di implementazione dell&#8217;ipotetica classe che usa il metodo <code>theNumberAsString</code>, che potrebbe ad esempio essere una azione che visualizza un numero in una casella di testo in conseguenza al clic di un utente, scriviamo quindi:</p>
<pre class="brush: objc; light: true;">-(IBAction)showANumber:(id)sender
{
MyNumber *aNumber = [[myNumber alloc] init];

[aNumber setTheNumber:pi];

NSString *aNumberString = [aNumber theNumberAsString];

[textView insertText:aNumberString];

[aNumber release];
}</pre>
<p>Facciamo quindi una cronistoria di ciò accade: dopo la creazione dell’oggetto di classe <code>MyNumber</code>, abbiamo creato un puntatore all’oggetto stringa <code>aNumberString</code> (che però è allocato nel metodo <code>theNumberAsString</code>, non in <code>showANumber</code>), gli assegnamo la stringa <code>theNumber</code> che proviene dalla classe <code>MyNumber</code> (è il compito che svolge proprio <code>theNumberAsString</code>) e poi inseriamo tale stringa nel <code>TextField</code> chiamato <code>textView</code>.</p>
<p>L’unico messaggio di <code>release</code> è quello inviato all’istanza <code>aNumber</code>, che è appunto l’unica allocata nel metodo <code>showANumber</code>. Una volta terminato tale metodo, il puntatore <code>aNumberString</code> va fuori ambito (<em>scope</em>) e, poiché nel nostro particolare meccanismo, subito dopo il programma resta in attesa di un’altra azione dell’utente (presumibilmente un altro clic), l’oggetto stringa restituito da <code>theNumberAsString</code> viene rilasciato (grazie all’autorilascio) e quindi deallocato.</p>
<p>Abbiamo così messo in opera un ottimo meccanismo per negare la resposabilità su un oggetto, che altrimenti non avremmo saputo dove rilasciare.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pianeta-apple.it/2010/12/17/oggetti-come-negare-la-responsabilita-con-autorelease/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Oggetti non deallocati e la perdita di memoria</title>
		<link>http://www.pianeta-apple.it/2010/12/10/oggetti-non-deallocati-e-la-perdita-di-memoria/</link>
		<comments>http://www.pianeta-apple.it/2010/12/10/oggetti-non-deallocati-e-la-perdita-di-memoria/#comments</comments>
		<pubDate>Fri, 10 Dec 2010 06:00:49 +0000</pubDate>
		<dc:creator>Pianeta Apple</dc:creator>
				<category><![CDATA[Primo piano]]></category>
		<category><![CDATA[Tip Xcode]]></category>

		<guid isPermaLink="false">http://www.pianeta-apple.it/?p=1346</guid>
		<description><![CDATA[La scorsa settimana abbiamo parlato dei metodi alloc e init nella creazione di oggetti in Objective-C. Sappiamo però che tenere in vita un oggetto significa consumare memoria ma, finquando questo oggetto ci serve, è un costo che paghiamo volentieri. Il memory leak (ovvero perdita o falla di memoria) è, infatti, un problema di carenza di [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.pianeta-apple.it/wp-content/uploads/2010/12/memory-leak-xcode.jpg"><img class="aligncenter size-full wp-image-1348" title="memory-leak-xcode" src="http://www.pianeta-apple.it/wp-content/uploads/2010/12/memory-leak-xcode.jpg" alt="" width="495" height="279" /></a></p>
<p>La scorsa settimana abbiamo parlato dei <a href="http://www.pianeta-apple.it/2010/12/03/tip-oggetti-e-gestione-della-memoria/">metodi alloc e init</a> nella creazione di oggetti in Objective-C. Sappiamo però che tenere in vita un oggetto significa consumare memoria ma, finquando questo oggetto ci serve, è un costo che paghiamo volentieri.</p>
<p>Il <em>memory leak</em> (ovvero perdita o falla di memoria) è, infatti, un problema di carenza di memoria causato spesso proprio da oggetti allocati e inizializzati che non vengono mai deallocati. Si tratta di un comune errore di programmazione poiché tali oggeti sono creati nell’ambito di un metodo (quindi in un blocco di codice chiuso fra parentesi graffe, un cosiddetto <em>scope</em>), si potrebbe pensare che vengano distrutti automaticamente appena usciti dall’ambito in cui sono stati creati, un po’ come accade per le variabili scalari.</p>
<p>In realtà, chiusa la parentesi graffa del metodo, ciò che cessa di esistere non è l’oggetto ma il puntatore all’oggetto. L’oggetto, pur senza alcun riferimento, continua ad esistere e ad occupare memoria. Bisogna quindi saper gestire in maniera opportuna il rilascio di questi oggetti, tramite una funzionalità di Objective-C chiamata <em>negazione della responsabilità</em>.</p>
<p>Va ricordato infatti che gli oggetti non devono mai essere deallocati direttamente dall’utente (dal momento che non si può prevedere che un oggetto creato da un metodo non serva ad un altro metodo), ma bisogna utilizzare il cosiddetto <em>contatore di retain</em>. Quando un oggetto viene allocato il suo contatore di retain è impostato automaticamente a 1, e viene incrementato ogni volta che in una parte di codice si dichiara l’interesse a quell’oggetto. Viceversa, quando l’oggetto non serve più, viene chiamato il metodo <code>release</code>, che decrementa il contatore di 1 finché, arrivato a zero, l’oggetto viene deallocato automaticamente dal sistema.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pianeta-apple.it/2010/12/10/oggetti-non-deallocati-e-la-perdita-di-memoria/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tip: oggetti e gestione della memoria</title>
		<link>http://www.pianeta-apple.it/2010/12/03/tip-oggetti-e-gestione-della-memoria/</link>
		<comments>http://www.pianeta-apple.it/2010/12/03/tip-oggetti-e-gestione-della-memoria/#comments</comments>
		<pubDate>Fri, 03 Dec 2010 06:00:57 +0000</pubDate>
		<dc:creator>Pianeta Apple</dc:creator>
				<category><![CDATA[Primo piano]]></category>
		<category><![CDATA[Tip Xcode]]></category>

		<guid isPermaLink="false">http://www.pianeta-apple.it/?p=1324</guid>
		<description><![CDATA[Quando una classe eredita da un’altra classe, eredita sia le funzionalità (cioè i metodi) che tutte le variabili di istanza dalla classe genitore. Per allocare la memoria necessaria per un oggetto, NSObject (di cui ogni oggetto è almeno figlio) fornisce un metodo di classe chiamato alloc che alloca sempre la memoria sufficiente per qualsiasi oggetto [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.pianeta-apple.it/wp-content/uploads/2010/11/alloc-init.jpg"><img src="http://www.pianeta-apple.it/wp-content/uploads/2010/11/alloc-init.jpg" alt="" title="alloc-init" width="495" height="278" class="aligncenter size-full wp-image-1327" /></a></p>
<p>Quando una classe eredita da un’altra classe, eredita sia le funzionalità (cioè i metodi) che tutte le variabili di istanza dalla classe genitore.</p>
<p>Per allocare la memoria necessaria per un oggetto, <code>NSObject</code> (di cui ogni oggetto è almeno figlio) fornisce un metodo di classe chiamato alloc che alloca sempre la memoria sufficiente per qualsiasi oggetto specifico:</p>
<pre class="brush: objc; light: true;">NSObject *someNewObject = [NSObject alloc];</pre>
<p>Il metodo alloc provvede anche a impostare tutte le variabili di istanza a <em>zero</em> e i puntatori a <em>nil</em>.</p>
<p>A questo punto bisogna solo inizializzare l’istanza della classe appena creata con il metodo di classe init, che può essere ridefinito a patto che vengano inizializzate tutte le variabili di istanza del genitore (che, ricordiamo, sono state tutte ereditate) e che venga restituita l’istanza stessa su cui il metodo è chiamato:</p>
<pre class="brush: objc;">-(id)init
{
	[super init];

	//altro codice

	return self;
}</pre>
<p>Richiamare <code>[super init]</code> tutte le volte che si eredita una classe è garanzia che, a cascata, tutte le variabili di istanza di tutta la genealogia della classe vengano correttamente inizializzate.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pianeta-apple.it/2010/12/03/tip-oggetti-e-gestione-della-memoria/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Tip Xcode: convenzioni sui nomi</title>
		<link>http://www.pianeta-apple.it/2010/11/26/tip-xcode-convenzioni-sui-nomi/</link>
		<comments>http://www.pianeta-apple.it/2010/11/26/tip-xcode-convenzioni-sui-nomi/#comments</comments>
		<pubDate>Fri, 26 Nov 2010 06:00:53 +0000</pubDate>
		<dc:creator>Pianeta Apple</dc:creator>
				<category><![CDATA[Primo piano]]></category>
		<category><![CDATA[Tip Xcode]]></category>

		<guid isPermaLink="false">http://www.pianeta-apple.it/?p=1129</guid>
		<description><![CDATA[La programmazione con  Objective-C, ma non solo, mette spesso di fronte al problema di rendere il codice più leggibile possibile. Nei decenni si sono sviluppate notevoli quantità di convenzioni per ottenere questo risultato. In Xcode ce ne sono due particolarmente importanti. Vediamole insieme. C&#8217;è camelCase e CamelCase Se il nome di metodo o di una [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.pianeta-apple.it/wp-content/uploads/2010/10/convenzioni-nomi.jpg"><img src="http://www.pianeta-apple.it/wp-content/uploads/2010/10/convenzioni-nomi.jpg" alt="" title="convenzioni-nomi" width="495" height="278" class="aligncenter size-full wp-image-1130" /></a></p>
<p>La programmazione con  Objective-C, ma non solo, mette spesso di fronte al problema di rendere il codice più leggibile possibile. Nei decenni si sono sviluppate notevoli quantità di convenzioni per ottenere questo risultato. In Xcode ce ne sono due particolarmente importanti. Vediamole insieme.</p>
<p><strong>C&#8217;è camelCase e CamelCase</strong></p>
<p>Se il nome di metodo o di una variabile è composto da più parole,  va seguita la convenzione <em>camelCase:</em> le parole devono essere concatenate l&#8217;una all&#8217;altra e devono essere scritte con l’iniziale maiuscola, tranne l&#8217;iniziale della prima parola.</p>
<p>Le classi si scrivono seguendo la stessa convenzione dei nomi, con la differenza che anche la prima parola va scritta con l’iniziale maiuscola. In questo modo quando si richiama un metodo di classe lo si riconosce subito:</p>
<pre class="brush: objc; light: true;">
[LengthConversion centimetersFromInches:inches];
</pre>
<p><strong>Indicare l&#8217;argomento del nome del metodo</strong></p>
<p>I metodi che accettano argomenti vanno scritti con il nome del primo argomento nel nome stesso del metodo, come ad esempio</p>
<pre class="brush: objc; light: true;">
-(float)centimetersFromInches:(float)inches;
</pre>
<p>Un’eccezione è nei nomi dei metodi target-azione, in cui l’argomento è sempre <em>sender</em>.</p>
<p>Se conoscete altre convenzioni utili, segnalatele pure nei commenti.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pianeta-apple.it/2010/11/26/tip-xcode-convenzioni-sui-nomi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Realizzare un eBook per iPad con Baker, un progetto Open Source italiano</title>
		<link>http://www.pianeta-apple.it/2010/11/10/realizzare-un-ebook-per-ipad-con-baker-un-progetto-open-source-italiano/</link>
		<comments>http://www.pianeta-apple.it/2010/11/10/realizzare-un-ebook-per-ipad-con-baker-un-progetto-open-source-italiano/#comments</comments>
		<pubDate>Wed, 10 Nov 2010 06:00:17 +0000</pubDate>
		<dc:creator>Pianeta Apple</dc:creator>
				<category><![CDATA[Applicazioni per iPad]]></category>
		<category><![CDATA[Dev]]></category>
		<category><![CDATA[Primo piano]]></category>

		<guid isPermaLink="false">http://www.pianeta-apple.it/?p=1172</guid>
		<description><![CDATA[Davide Casali, Marco Colombo e Alessandro Morandi sono gli sviluppatori che si stanno occupando del progetto Baker, un framework Open Source per Xcode che permette, in maniera molto semplice, di realizzare un eBook per iPad in poco tempo. L&#8217;eBook, in forma di applicazione, e non di ePub, è subito inviabile ad Apple per l&#8217;approvazione e [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.pianeta-apple.it/wp-content/uploads/2010/11/baker-hero.jpg"><img class="aligncenter size-full wp-image-1174" title="baker-hero" src="http://www.pianeta-apple.it/wp-content/uploads/2010/11/baker-hero.jpg" alt="" width="495" height="279" /></a></p>
<p>Davide Casali, Marco Colombo e Alessandro Morandi sono gli sviluppatori che si stanno occupando del <a href="http://bakerframework.com/">progetto Baker</a>, un framework <em>Open Source</em> per <em>Xcode</em> che permette, in maniera molto semplice, di realizzare un <em>eBook</em> per iPad in poco tempo. L&#8217;eBook, in forma di applicazione, e non di ePub, è subito inviabile ad Apple per l&#8217;approvazione e la vendita su <em>App Store</em>.</p>
<p>Il progetto è sviluppato su <a href="https://github.com/simbul/baker">GitHub</a>, la piattaforma di condivisione e collaborazione di cui <a href="http://www.pianeta-apple.it/2010/11/05/github-programmazione-sociale/">abbiamo parlato la settimana scorsa</a> e che permette di realizzare un fork, una diramazione, partendo proprio da un progetto come Baker, per realizzarne la propria personale versione, oppure proprio di collaborare con gli sviluppatori per contribuire a sviluppare il progetto originale.</p>
<p>Per sfruttare al meglio <em>Baker</em> sono necessari tre passaggi principali:</p>
<p>Il <strong>primo</strong> passaggio è la progettazione di pagine <em>HTML</em> che abbiano una larghezza fissa di 768 pixel (quella dell&#8217;iPad) usando tutte le tecnologie a disposizione di WebKit, ovverosia <em>HTML 5</em>, <em>CSS</em> e <em>Javascript</em>. Per testare la grafica e il funzionamento di queste pagine, ognuna delle quali deve rappresentare un capitolo del libro, è sufficiente caricarle su Safari. Per questo scopo è utile usare il <a href="http://bakerframework.com/down/baker-css-768px.zip">codice CSS a larghezza fissa</a> di 768 pixel messo a disposizione dal team di Baker.</p>
<p>Il <strong>secondo</strong> passaggio e la realizzazione del pacchetto che verrà usato dal framework. Si tratta semplicemente di una cartella chiamata <em>book</em> che dovrà contenere, come già accennato, i file <em>HTML</em>, uno per ogni capitolo. In particolare si dovranno chiamare <em>1.html</em>, <em>2.html</em>, eccetera, con 1.html che presumibilmente sarà la copertina dell&#8217;eBook. Nella stessa cartella dovranno essere incluse anche tutte le immagini e gli altri file necessari ai documenti <em>HTML</em>, anche inseriti in sottocartelle. Gli autori del progetto Baker hanno messo a disposizione un file zip contente un <a href="http://bakerframework.com/down/baker-hpub-example-draft.zip">eBook d&#8217;esempio</a> in formato <em>HTML</em>, creato secondo le linee guida qui sopra illustrate.</p>
<p>Il <strong>terzo</strong> ed ultimo passaggio consiste nel <a href="http://bakerframework.com/down/baker-framework-1.0.zip">download del framework</a>, sotto forma di progetto Xcode (e <a href="http://it.wikipedia.org/wiki/Licenze_BSD">licenza BSD</a>, nella versione a tre clausole). Basta scompattare lo zip, sostituire la cartella book con quella preparata in precedenza (o quella d&#8217;esempio) e fare doppio clic sul file <em>Baker.xcodeproj</em> per aprirlo in <em>Xcode</em>. A questo punto ci sono delle modifiche da fare per poter pubblicare l&#8217;applicazione eBook, ma possiamo già cliccare sul pulsante <em>Build&amp;Run</em> per vedere, con il Simulatore, come apparirebbe l&#8217;esempio di libro digitale su iPad:</p>
<div id="attachment_1173" class="wp-caption aligncenter" style="width: 287px"><a href="http://www.pianeta-apple.it/wp-content/uploads/2010/11/baker-esempio.jpg"><img class="size-medium wp-image-1173" title="baker-esempio" src="http://www.pianeta-apple.it/wp-content/uploads/2010/11/baker-esempio-277x360.jpg" alt="" width="277" height="360" /></a><p class="wp-caption-text">fai clic per ingrandire</p></div>
<p>Ovviamente prima della pubblicazione dobbiamo rinominare il progetto Xcode (dal menu <em>Project&gt;Rename&#8230;</em>) e inserire l&#8217;icona che vogliamo appaia su App Store e su iPad, una volta installato l&#8217;eBook. Per qualsiasi dubbio, il progetto include un file <a href="https://github.com/Simbul/baker/blob/master/README" class="broken_link">Readme</a> che spiega tutti i passaggi necessari in maggior dettaglio.</p>
<p>Grazie a <a href="http://senonlarealta.blogspot.com/">Francesco</a> per la segnalazione.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pianeta-apple.it/2010/11/10/realizzare-un-ebook-per-ipad-con-baker-un-progetto-open-source-italiano/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>GitHub: programmazione sociale</title>
		<link>http://www.pianeta-apple.it/2010/11/05/github-programmazione-sociale/</link>
		<comments>http://www.pianeta-apple.it/2010/11/05/github-programmazione-sociale/#comments</comments>
		<pubDate>Fri, 05 Nov 2010 06:00:26 +0000</pubDate>
		<dc:creator>Pianeta Apple</dc:creator>
				<category><![CDATA[Dev]]></category>
		<category><![CDATA[Primo piano]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://www.pianeta-apple.it/?p=1156</guid>
		<description><![CDATA[GitHub è un sito per archiviare e condividere codice con altri programmatori, sviluppando insieme progetti soprattutto Open Source. Non è la prima piattaforma che permette alle comunità spontaneamente nate in rete di sviluppare un progetto comune, ma certamente si tratta di un sito ottimamente realizzato. Si può scegliere di creare un account gratuito senza limiti [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.pianeta-apple.it/wp-content/uploads/2010/11/github.jpg"><img class="aligncenter size-full wp-image-1157" title="github" src="http://www.pianeta-apple.it/wp-content/uploads/2010/11/github.jpg" alt="" width="495" height="278" /></a></p>
<p><a href="https://github.com/">GitHub</a> è un sito per archiviare e condividere codice con altri programmatori, sviluppando insieme progetti soprattutto Open Source. Non è la prima piattaforma che permette alle comunità spontaneamente nate in rete di sviluppare un progetto comune, ma certamente si tratta di un sito ottimamente realizzato.</p>
<p>Si può scegliere di creare un account gratuito senza limiti di numero di repository (deposito di codice) e senza limiti di collaboratori. Esistono poi ben 7 profili di account a pagamento, dal Micro a 7.00 $/mese per 5 repository privati e 1 collaboratore privato, fino al Platinium a 200 $/mese per 125 repository privati e un numero qualunque di team di sviluppo.</p>
<p>Innanzitutto, all&#8217;accesso si può cliccare in alto, dove si trova la scritta</p>
<blockquote><p>Would you rather see this site in Italian? (Vorresti visualizzare questo sito in Italiano?)</p></blockquote>
<p>La traduzione non è ancora completa, ma può aiutare a muoversi più velocemente nel sito.</p>
<p>Moltissimi sono i <a href="https://github.com/languages">linguaggi supportati</a>, con colorazione della sintassi. Ecco l&#8217;elenco completo:</p>
<blockquote><p>ActionScript, Arc, ASP, Assembly, Boo, C, C#, C++, Clojure, CoffeeScript, ColdFusion, Common Lisp, D, Delphi, Duby, Eiffel, Emacs Lisp, Erlang, F#, FORTRAN, Go, Groovy, Haskell, HaXe, Io, Java, JavaScript, Lua, Max/MSP, Nu, Objective-C, Objective-J, OCaml, ooc, Perl, PHP, Pure Data, Python, R, Racket, Ruby, Scala, Scheme, sclang, Self, Shell, Smalltalk, SuperCollider, Tcl, Vala, Verilog, VHDL, VimL e Visual Basic.</p></blockquote>
<p>In Objective-C, linguaggio principe per la programmazione per Mac OS X e iOS, esistono molti <a href="https://github.com/languages/Objective-C">progetti aperti</a>, come ad esempio il <a href="https://github.com/facebook/facebook-ios-sdk">FaceBook iOS SDK</a>, la libreria open source per integrare Facebook nella propria applicazione. Tale progetto è quello che ha subito, recentemente, il maggior numero di fork, ovvero diramazioni: molti sono stati i programmatori che, usando GitHub, hanno preso questo SDK per adattarlo alle proprie esigenze di sviluppo.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pianeta-apple.it/2010/11/05/github-programmazione-sociale/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Xcode: dalla Documentazione al codice</title>
		<link>http://www.pianeta-apple.it/2010/10/29/xcode-dalla-documentazione-al-codice/</link>
		<comments>http://www.pianeta-apple.it/2010/10/29/xcode-dalla-documentazione-al-codice/#comments</comments>
		<pubDate>Fri, 29 Oct 2010 05:00:39 +0000</pubDate>
		<dc:creator>Pianeta Apple</dc:creator>
				<category><![CDATA[Dev]]></category>
		<category><![CDATA[Primo piano]]></category>

		<guid isPermaLink="false">http://www.pianeta-apple.it/?p=991</guid>
		<description><![CDATA[Dopo aver letto l&#8221;articolo in tre parti &#8220;Xcode: imparare a usare la Documentazione&#8221;, siamo pronti per tradurre le conoscenze acquistite con lo studio delle referenze di NSTableView, NSMutableArray e NSDocument in una applicazione funzionante. Se ne senti il bisogno, rileggi prima le tre parti Xcode: imparare a usare la Documentazione /1 Xcode: imparare a usare [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.pianeta-apple.it/wp-content/uploads/2010/10/doc2app.jpg"><img class="aligncenter size-full wp-image-1072" title="doc2app" src="http://www.pianeta-apple.it/wp-content/uploads/2010/10/doc2app.jpg" alt="" width="495" height="278" /></a></p>
<p>Dopo aver letto l&#8221;articolo in tre parti <em>&#8220;Xcode: imparare a usare la Documentazione&#8221;</em>, siamo pronti per tradurre le conoscenze acquistite con lo studio delle referenze di <em>NSTableView</em>, <em>NSMutableArray </em>e <em>NSDocument </em>in una applicazione funzionante.</p>
<p>Se ne senti il bisogno, rileggi prima le tre parti</p>
<ul>
<li><a href="http://www.pianeta-apple.it/2010/10/22/xcode-imparare-a-usare-la-documentazione-1/">Xcode: imparare a usare la Documentazione /1</a></li>
<li><a href="http://www.pianeta-apple.it/2010/10/22/xcode-imparare-a-usare-la-documentazione-2/">Xcode: imparare a usare la Documentazione /2</a></li>
<li><a href="http://www.pianeta-apple.it/2010/10/22/xcode-imparare-a-usare-la-documentazione-3/">Xcode: imparare a usare la Documentazione /3</a></li>
</ul>
<p><strong>Progetto dell&#8217;applicazione</strong></p>
<p>Come forse hai già immaginato, se durante lo studio della <em>Documentazione </em>siamo partiti dalla <em>Table View</em>, per poi scoprire che dovevamo usare un <em>NSMutableArray </em>come sorgente dati, ed infine scoprire che per salvare tutto in un file ci serviva <em>NSDocument</em>, ora progetteremo l&#8217;applicazione e scriveremo il codice in senso inverso: prima creando un progetto <em>Xcode Document-Based</em>, poi creando l&#8217;<em>array</em> e infine collegandolo con la <em>Table View</em>, creando anche tutti i metodi per far interagire la <em>Table View </em>con l&#8217;<em>array</em>.</p>
<p><strong>Guida video di supporto</strong></p>
<p>A corredo di questo articolo abbiamo pubblicato una <a href="http://www.pianeta-apple.it/?post_type=external-videos&amp;p=1084">Guida video</a> che ripercorre tutti i passaggi qui di seguito presentati. La <a href="http://www.pianeta-apple.it/?post_type=external-videos&amp;p=1084">Guida video</a> non si dilunga in spiegazioni ma è solamente un supporto visivo per chi non ha ancora maturato dimestichezza con l&#8217;ambiente di sviluppo di <em>Xcode</em> e <em>Interface Builder</em>.</p>
<p><strong>Creare il progetto</strong></p>
<p>Si comincia creando un nuovo progetto andando su <em>File &gt; New Project&#8230;</em> e scegliendo una <em>Cocoa Application</em>. Xcode ci permette di usare immediatamente la classe <em>NSDocument </em>mettendo il segno di spunta su <em>Create document-based application</em>.</p>
<p>Se la nostra tabella vogliamo che serva ad elencare delle squadre di calcio, giusto per fare un esempio, allora potremmo chiamare l&#8217;applicazione <strong>TeamList</strong>.</p>
<p>Vengono creati tutti i file necessari, compresi due file <em>xib</em>, <em>MainMenu.xib</em> e <em>MyDocument.xib</em>. Quest&#8217;ultimo file è la finestra in cui metteremo la<em> Table View</em>.</p>
<p><strong>Creare l&#8217;interfaccia grafica</strong></p>
<p>Se apriamo <em>MyDocument.xib</em> in <strong>Interface Builder</strong> possiamo costruire l&#8217;interfaccia grafica del nostro documento, che poi altro non sarà che una tabella, qualche pulsante, una label e un campo di testo. Potremmo creare l&#8217;interfaccia anche dopo aver scritto tutto il codice, ma progettarla adesso ci aiuta a fissare meglio le idee su come vogliamo che funzioni l&#8217;applicazione.</p>
<p>Prima di tutto eliminiamo la <em>Label </em>al centro finestra e prendiamo quindi un oggetto <em>Table View</em> dalla <strong>Library</strong>, trascinandola nella finestra stessa. Dopo averla ridimensionata, eliminiamo una colonna. Il modo più semplice è cliccare sulla<em> Table View</em>, andare sull&#8217;<em>Inspector</em>, nella sezione <em>Attributes</em> (premendo <em>⌘1</em>), e impostando  il numero di colonne a 1.</p>
<p>Possiamo anche digitare una intestazione per la colonna facendo doppio click sull&#8217;Header e scrivendo, nel nostro esempio, <em>Lista delle squadre</em>. Poi aggiungiamo un <em>Push Button</em>, un <em>Text Field</em> e una <em>Label </em>in basso a sinistra. In basso a destra mettiamo invece uno <em>Square Button</em> il cui attributo Image dovrà essere <em>NSRemoveTemplate</em>: verrà aggiunto automaticamente un segno meno in formato standard.</p>
<p>Per il resto regolate dimensioni e posizioni in base al vostro gusto e alle linee guida blu che <em>Interface Builder</em> mostra quando si fanno queste regolazioni: sono linee che aiutano a seguire le <a href="http://developer.apple.com/library/mac/documentation/UserExperience/Conceptual/AppleHIGuidelines/XHIGIntro/XHIGIntro.html#//apple_ref/doc/uid/20000957" class="broken_link">Human Interface Guidelines</a> di Apple.</p>
<p>Il risultato finale dovrà assomigliare a qualcosa del genere:</p>
<p><a href="http://www.pianeta-apple.it/wp-content/uploads/2010/10/tableview-interface-builder-2.jpg"><img class="aligncenter size-medium wp-image-1067" title="tableview-interface-builder 2" src="http://www.pianeta-apple.it/wp-content/uploads/2010/10/tableview-interface-builder-2-339x360.jpg" alt="" width="339" height="360" /></a></p>
<p><strong>Stesura del codice</strong></p>
<p>Dal momento che ormai abbiamo chiaro in testa cosa deve fare l&#8217;applicazione e sappiamo anche come farlo perché abbiamo studiato le pagine necessarie della <em>Documentazione</em> (non hai studiato? <a href="http://www.pianeta-apple.it/2010/10/22/xcode-imparare-a-usare-la-documentazione-1/">Torna indietro!</a>), possiamo scrivere tutto il codice necessario. Potrebbe essere una buona idea quella di aprire le tre parti dell&#8217;articolo<em> &#8220;Xcode: imparare a usare la Documentazione&#8221;</em> (<a href="http://www.pianeta-apple.it/2010/10/22/xcode-imparare-a-usare-la-documentazione-1/">1</a>, <a href="http://www.pianeta-apple.it/2010/10/22/xcode-imparare-a-usare-la-documentazione-2/">2</a> e <a href="http://www.pianeta-apple.it/2010/10/22/xcode-imparare-a-usare-la-documentazione-3/">3</a>) in tre pannelli del browser per seguire meglio la stesura del codice.</p>
<p>I file di codice che dobbiamo modificare sono solamente 2: <em>MyDocument.h</em> e <em>MyDocument.m</em>. Questi rappresentano la classe <em>MyDocument</em>, di cui <em>MyDocument.xib</em> è il corrispettivo grafico. Non servirà quindi creare una istanza della classe <em>MyDocument</em> nel file <em>xib</em>, poiché quest&#8217;ultimo è già il proprietario della classe.</p>
<p>Nel file <em>MyDocument.h</em> dobbiamo dichiarare</p>
<ul>
<li>gli <em>Outlet</em> per permettere l&#8217;accesso ai dati della <em>TableView</em> e del <em>TextField</em></li>
<li>le <em>Action</em> per poter far eseguire un codice quando si preme sui due pulsanti</li>
<li>l&#8217;<em>array</em> che sarà la nostra sorgente dati e dovrà essere persistente finquando la finestra <em>MyDocument </em>non verrà chiusa.</li>
</ul>
<p>Il codice del file <em>MyDocument.h</em> è quindi il seguente:</p>
<pre class="brush: objc;">
@interface MyDocument : NSDocument
{

IBOutlet NSTableView *teamListTableView;
IBOutlet NSTextField *newTeamTextField;

NSMutableArray *teamListArray;

}

- (IBAction)addToTeamList:(id)sender;
- (IBAction)deleteFromTeamList:(id)sender;

@end
</pre>
<p>Il significato dovrebbe essere chiaro, per domande usate <a href="#respond">i commenti</a>.</p>
<p>Molto più complessa sarà la stesura del codice di implementazione nel file <em>MyDocument.m</em>. Vediamo uno ad uno tutti i metodi che devono essere aggiunti ed implementati.</p>
<p>Personalizziamo il metodo di inizializzazione, creando l&#8217;array che dovrà essere trattenuto per tutta la vita del documento:</p>
<pre class="brush: objc;">
- (id)init
{
    self = [super init];
    if (self) {
		teamListArray = [[NSMutableArray alloc] initWithObjects:@&quot;Juventus&quot;, @&quot;Milan&quot;, @&quot;Inter&quot;, nil];
    }
    return self;
}
</pre>
<p>Quindi, specularmente, scriviamo il metodo di deallocazione</p>
<pre class="brush: objc;">
-(void)dealloc
{
	[teamListArray release];

	[super dealloc];
}
</pre>
<p>I prossimi due metodi servono per costruire la tabella. Dapprima si determina il numero di righe da creare:</p>
<pre class="brush: objc;">
- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView
{
return [teamListArray count];
}
</pre>
<p>E poi si popolano con ciò che è contenuto nell&#8217;array, riga per riga:</p>
<pre class="brush: objc;">
- (id)tableView:(NSTableView *)aTableView
		objectValueForTableColumn:(NSTableColumn *)aTableColumn
			row:(NSInteger)rowIndex
{
	return [teamListArray objectAtIndex:rowIndex];
}

Ora scriviamo il metodo dell'azione scaturita dal clic sul pulsante &lt;em&gt;Aggiungi&lt;/em&gt;

[obj-c]
- (IBAction)addToTeamList:(id)sender
{
	[teamListArray addObject:[newTeamTextField stringValue]];

	[newTeamTextField setStringValue:@&quot;&quot;];

	[teamListTableView reloadData];

	[self updateChangeCount:NSChangeDone];

}
</pre>
<p>Questo è invece il metodo che viene lanciato quando si clicca sul tasto per rimuovere una squadra. Se nessuna riga è selezionata esce dal metodo senza fare nulla.</p>
<pre class="brush: objc;">
- (IBAction)deleteFromTeamList:(id)sender
{
	int selectedItemIndex = [teamListTableView selectedRow];

	if (selectedItemIndex != -1 ) {

		[teamListArray removeObjectAtIndex:selectedItemIndex];

		[teamListTableView reloadData];

		[self updateChangeCount:NSChangeDone];
	}
}
</pre>
<p>Questo metodo fa parte del protocollo <em>TableViewDataSource</em> e viene richiamato quando si vuol modificare una riga e si fa quindi doppio clic, si scrive il nuovo nome e poi si fa invio:</p>
<pre class="brush: objc;">
- (void)tableView:(NSTableView *)aTableView
	setObjectValue:(id)anObject
		forTableColumn:(NSTableColumn *)aTableColumn
			row:(NSInteger)rowIndex
{
	[teamListArray replaceObjectAtIndex:rowIndex withObject:anObject];

	[self updateChangeCount:NSChangeDone];
}
</pre>
<p>Gli ultimi due metodi servono per salvare e riaprire il documento che contiene i dati dell&#8217;array. Il primo semplicemente scrive un file temporaneo (grazie all&#8217;argomento <em>atomically:YES</em>) e poi lo sposta nella posizione scelta dal pannello di salvataggio.</p>
<pre class="brush: objc;">
- (BOOL)writeToURL:(NSURL *)absoluteURL
			ofType:(NSString *)typeName
			 error:(NSError **)outError
{
	return [teamListArray writeToURL:absoluteURL atomically:YES];
}
</pre>
<p>Quest&#8217;altro apre un documento precedentemente salvato. In questo modo viene aperta anche un&#8217;altra finestra del programma, per cui è necessario rilasciare l&#8217;array allocato e inizializzato nel metodo <em>init</em>, riallocarlo e reinizializzarlo, questa colta con il contenuto del file aperto. Poi si ricarica la tabella che, avendo l&#8217;array come sorgente dati, rifletterà il contenuto del file aperto.</p>
<pre class="brush: objc;">
- (BOOL)readFromURL:(NSURL *)absoluteURL
			 ofType:(NSString *)typeName
			  error:(NSError **)outError
{
	[teamListArray release];

	teamListArray = [[NSMutableArray alloc] initWithContentsOfURL:absoluteURL];

	[teamListTableView reloadData];

	return YES;
}
</pre>
<p><strong>Collegare i metodi all&#8217;interfaccia</strong></p>
<p>Se si ha dimestichezza con Interface Builder, collegare le azioni e gli outlet all&#8217;interfaccia non sarà particolarmente difficile. Basterà infatti fare clic col tasto destro del mouse (clic secondario) sul cubo del File&#8217;s Owner, per aprire l&#8217;hud nero che elenca gli <em>Outlet</em>, le <em>Received Action</em> e i <em>Referencing Outlet</em>.</p>
<p>Dobbiamo quindi solo collegare le seguenti coppie:</p>
<ul>
<li>newTeamTextField con il Text Field</li>
<li>teamListTableView con la Table View</li>
<li>addToTeamList con il Pulsante &#8220;Aggiungi&#8221;</li>
<li>deleteFromTeamList con il Pulsante quadrato &#8220;-&#8221;</li>
</ul>
<p>Infine va creato un riferimento fra il documento NSDocument e la Table View di modo che la NSDocument sappia cosa deve salvare su file (ovviamente via codice abbiamo fatto l&#8217;uteriore collegamento Table View-array). Quindi colleghiamo</p>
<ul>
<li>dataSource con la Table View</li>
</ul>
<p>Il risultato dovrebbe essere il seguente</p>
<p><a href="http://www.pianeta-apple.it/wp-content/uploads/2010/10/tableview-hud.jpg"><img class="aligncenter size-full wp-image-1071" title="tableview-hud" src="http://www.pianeta-apple.it/wp-content/uploads/2010/10/tableview-hud.jpg" alt="" width="352" height="336" /></a></p>
<p>Salvate, tornate in <em>Xcode</em>, compilate, eseguite e testate ogni funzionalità.</p>
<p>Per una dimostrazione della creazione di questo progetto vi rimando alla Guida video <a href="http://www.pianeta-apple.it/?post_type=external-videos&amp;p=1084">&#8220;Xcode: creare una lista di squadre di calcio&#8221;</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.pianeta-apple.it/2010/10/29/xcode-dalla-documentazione-al-codice/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Xcode: imparare a usare la Documentazione /3</title>
		<link>http://www.pianeta-apple.it/2010/10/22/xcode-imparare-a-usare-la-documentazione-3/</link>
		<comments>http://www.pianeta-apple.it/2010/10/22/xcode-imparare-a-usare-la-documentazione-3/#comments</comments>
		<pubDate>Fri, 22 Oct 2010 05:03:55 +0000</pubDate>
		<dc:creator>Pianeta Apple</dc:creator>
				<category><![CDATA[Tip Xcode]]></category>

		<guid isPermaLink="false">http://www.pianeta-apple.it/?p=975</guid>
		<description><![CDATA[Il cuore della nostra Table View e della relativa sorgente dati è stato ormai studiato. Sembra tutto pronto per cominciare a scrivere del codice, ma in realtà rimane da studiare un modo per salvare e aprire un file che contenga le informazioni memorizzate nell&#8217;NSMutableArray. Le parti precedenti dell&#8217;articolo sono Xcode: imparare a usare la Documentazione [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.pianeta-apple.it/wp-content/uploads/2010/10/documentation-xcode.jpg"><img src="http://www.pianeta-apple.it/wp-content/uploads/2010/10/documentation-xcode.jpg" alt="" title="documentation-xcode" width="495" height="278" class="aligncenter size-full wp-image-1063" /></a></p>
<p>Il cuore della nostra <em>Table View</em> e della relativa sorgente dati è stato ormai studiato. Sembra tutto pronto per cominciare a scrivere del codice, ma in realtà rimane da studiare un modo per salvare e aprire un file che contenga le informazioni memorizzate nell&#8217;<em>NSMutableArray</em>.</p>
<p>Le parti precedenti dell&#8217;articolo sono</p>
<ul>
<li><a href="../2010/10/22/xcode-imparare-a-usare-la-documentazione-1/">Xcode: imparare a usare la Documentazione /1</a></li>
<li><a href="../2010/10/22/xcode-imparare-a-usare-la-documentazione-2/">Xcode: imparare a usare la Documentazione /2</a></li>
</ul>
<p><strong>NSDocument</strong></p>
<p>In realtà è sufficiente dare un&#8217;occhiata ai vari tipi di template disponibili quando creiamo un nuovo proggetto in <em>Xcode </em>per accorgerci che esiste un opzione <em>Document-Based</em>. Ma questo presuppone aver già letto qualcosa sul salvataggio dei file. Per questo facciamo finta che il nostro neo-programmatore non abbia mai sentito nominare questo tipo di applicazioni e che vada a cercare &#8220;save file&#8221; nella <em>Documentazione</em>.</p>
<p>I primi due risultati nella categoria Reference sono:</p>
<ul>
<li><a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSSavePanel_Class/">NSSavePanel Class Reference</a></li>
<li><a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSDocument_Class/">NSDocument Class Reference</a></li>
</ul>
<p>Il primo serve per gestire il pannello di salvataggio ed è, a quanto pare, troppo in profondità: noi vogliamo sapere come si salva, non siamo ancora interessati a modificare il comportamento del pannello di salvataggio.</p>
<p>Il secondo risultato ci porta alla classe <em>NSDocument,</em> il cui paragrafo introduttivo, <em>Class at a Glance</em>, ci dice che:</p>
<blockquote><p><code>NSDocument</code> is an abstract class that defines the interface for documents, objects that can internally represent data displayed in windows and that can read data from and write data to files. Documents create and manage one or more window controllers and are in turn managed by a document controller. Documents respond to first-responder action messages to save, revert, and print their data.</p></blockquote>
<p>La cosa più importante che ci viene detta in questo paragrafo è che i documenti sono oggetti che possono rappresentare internamente dei dati visualizzati in finestre e che possono leggere dati da file e scriverli su file. Ottimo, è esattamente quello che ci serve.</p>
<p>Nel paragrafo <em>Commonly Used Method</em> troviamo due metodi gemelli:</p>
<dl>
<blockquote><dl>
<dt><code><a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSDocument_Class/Reference/Reference.html#//apple_ref/occ/instm/NSDocument/writeToURL:ofType:error:">writeToURL:ofType:error:</a></code></dt>
<dd>Writes the document’s data to a URL.</p>
</dd>
<dt><code><a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSDocument_Class/Reference/Reference.html#//apple_ref/occ/instm/NSDocument/readFromURL:ofType:error:">readFromURL:ofType:error:</a></code></dt>
<dd>Reads the document’s data from a file.</p>
</dd>
</dl>
</blockquote>
</dl>
<p>Utilizzeremo il primo per scrivere il file e il secondo per leggerlo. Da notare come la posizione sul disco possa essere indicata anche come URL, similmente ad una posizione sul web.</p>
<p>A questo punto dobbiamo solo trovare i metodi corrispondenti della classe <em>NSArray </em>per scrivere il contenuto dell&#8217;array sul file e per creare un array con i contenuto del file.</p>
<p>Tornando alla documentazione di NS Array troviamo <a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html#//apple_ref/occ/instm/NSArray/writeToURL:atomically:">writeToURL:atomically:</a> che ci sembra ottimo per essere usato in <code>writeToURL:ofType:error:</code> di <em>NSDocument</em>. E troviamo anche <a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSArray_Class/NSArray.html#//apple_ref/occ/instm/NSArray/initWithContentsOfURL:">initWithContentsOfURL:</a> che permette di inizializzare un array con il contenuto di un file.</p>
<p>Un ultimo aspetto interessante, che potremmo voler implementare per far assomigliare la nostra applicazione ad una vera applicazione, è la possibilità di monitorare i cambiamenti effettuati dall&#8217;utente alla tabella. Lo scopo è quello di avvisare l&#8217;utente, mentre sta chiudendo il documento, che ci sono dei dati non salvati, ed eventualmente permettergli di salvarli.</p>
<p>Per fare questo dobbiamo solamente sfruttare il metodo di <em>NSDocument</em> chiamato <a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSDocument_Class/Reference/Reference.html#//apple_ref/occ/instm/NSDocument/updateChangeCount:">updateChangeCount:</a>. Il paragrafo <em>Discussion </em>spiega:</p>
<blockquote><p>The change count indicates the document’s edited status; if the change  count is 0, the document has no changes to save, and if the change count  is greater than 0, the document has been edited and is unsaved. The <em>changeType</em> is described in <a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSDocument_Class/Reference/Reference.html#//apple_ref/doc/uid/20000008-54197">“Constants.”</a> If you are implementing undo and redo in an application, you should  increment the change count every time you create an undo group and  decrement the change count when an undo or redo operation is performed.</p></blockquote>
<p>Se andiamo nella pagina <em>Constants</em> e scendiamo fino a <strong>NSDocumentChangeType</strong>, possiamo leggere con quale costante possiamo incrementare il contatore <em>ChangeCount</em>:</p>
<blockquote><dl>
<dt><code id="jumpTo_96">NSChangeDone</code></dt>
</dl>
<p>Increment change count. The value to pass to <code><a href="http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSDocument_Class/Reference/Reference.html#//apple_ref/occ/instm/NSDocument/updateChangeCount:">updateChangeCount:</a></code> to indicate that a single change has been done.</p></blockquote>
<p>Se chiamiamo questo metodo ogni volta che effettuiamo una modifica alla tabella (e quindi all&#8217;array), avremo la certezza di non perdere accidentalmente tali modifiche.</p>
<p>Le parti precedenti dell&#8217;articolo sono</p>
<ul>
<li><a href="../2010/10/22/xcode-imparare-a-usare-la-documentazione-1/">Xcode: imparare a usare la Documentazione /1</a></li>
<li><a href="../2010/10/22/xcode-imparare-a-usare-la-documentazione-2/">Xcode: imparare a usare la Documentazione /2</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.pianeta-apple.it/2010/10/22/xcode-imparare-a-usare-la-documentazione-3/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk
Page Caching using disk (enhanced)

Served from: www.pianeta-apple.it @ 2013-06-20 09:11:02 -->