Si sono chiuse le votazione per il Miglior Blog Tecnico Italiano 2008-2009, iniziativa ideata da Cristiano Fino, progetto al momento unico nel panorama della blogosfera italiana.
Archivio giugno, 2009
Miglior Blog Tecnico Italiano 2008-2009: proclamato il vincitore
Apple iPhone SDK 3.0: risolto baco su UIButton buttonWithType
Come indicato nel post Apple iPhone SDK 3.0: prime incompatibilità le SDK 3.0 di Apple mostrano comportamenti differenti rispetto alla release 2.2.1. Il supporto di assistenza per gli sviluppatori mi ha fornito la risposta, e quindi la soluzione al problema. La risposta del supporto tecnico è stata che [UIButton buttonWithType:] già chiama – al suo interno – la initWithFrame. Ne deriva che, sempre secondo il supporto tecnico, scrivendo:
Da Actionscript ad Objective-C
Ho pensato che potrebbe essere utile a chi si è avvicinato da poco allo sviluppo di applicazioni per Apple iPhone, confrontare Adobe Actionscript – il linguaggio utilizzato in Adobe Flash e Adobe Flex, più diffuso tra i neo-programmatori – e Objective-C, il linguaggio utilizzato da Apple per sviluppare le sue applicazioni. Objective-C è a tutti gli effetti un linguaggio ad oggetti nel senso puro, non che Actionscript non lo sia, ma Objective-C ha sicuramente una marcia in più in quanto è un’estensione dell’ANSI C e la sua sintassi è un mix tra C/C++ e Smalltalk; è un vero OO (Object-oriented language).
Apple iPhone SDK 3.0: prime incompatibilità
Dopo aver installato le SDK 3.0 per Apple iPhone, evidentemente ancora non perfettamente stabili, ho subito riscontrato alcuni problemi, sia nella compilazione del codice sia nell’impostazione generale di XCode. Il più importante – che ho prontamente segnalato con un “case” ad Apple, al centro sviluppatori – riguarda la creazione di bottoni tramite codice. Ecco un estratto del codice non compatibile con le SDK 3.0:
1 2 3 4 | UIButton *myButton = [[UIButton buttonWithType:UIButtonTypeRoundedRect] initWithFrame:CGRectMake(0, 0, 100, 40)]; [myButton setTitle:@"Bottone" forState:UIControlStateNormal]; // altre impostazioni [self.view addSubview:myButton]; |
Compilando questo codice con le SDK 2.2.1 si ottiene un classico bottone con la label “Bottone”. Con le SDK 3.0 il bottone viene creato ma la label scompare. Utilizzando come buttonWithType il tipo UIButtonTypeCustom la situazione sembra migliorare, nel senso che la label viene resa apparentemente in modo corretto. Rimane comunque strano l’improvviso malfunzionamento sul tipo UIButtonTypeRoundedRect. Sono ancora in attesa di una risposta da Apple… appena ho novità; posto!
The First: disponibile su iTunes
iPhone: l’utilissima proprietà tag
Tutti gli oggetti che derivano dalla classe <a target="_blank" href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/cl/UIView">UIView</a>, ereditano l’utilissima proprietà <a target="_blank" href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/doc/uid/TP40006816-CH3-SW25">tag</a>. Questa proprietà è un vero e proprio user-data (un “posto” che lo sviluppatore usa per usi generici) di tipo <a target="_blank" href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_DataTypes/Reference/reference.html#//apple_ref/doc/c_ref/NSInteger">NSInteger</a>, dove quindi possiamo memorizzare esclusivamente numeri.
L’uso che se ne può fare dipende ovviamente dalle circostanze tuttavia risulta utilissimo per individuare un determinato oggetto allo scattare di un evento comune. Ad esempio immaginiamo di avere due <a target="_blank" href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIAlertView_Class/UIAlertView/UIAlertView.html">UIAlertView</a> che rispondono allo stesso evento:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | // primo alert UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Primo" message:@"Primo Alert" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil,nil]; [alert show]; [alert release]; // ... // secondo alert UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Secondo" message:@"Secondo Alert" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil,nil]; [alert show]; [alert release]; // Evento // Cliccandi sul bottone OK degli Alter verrà chiamata questa funzione -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { // todo } |
Nota: negli esempi di codice troverete l’indicazione C++. Questo non è del tutto corretto in quanto, come saprete, il linguaggio usato è Objective-C. Questo a causa del fatto che il Plugin che uso per visualizzare il codice sorgente non supporta Objective-C, e il C++ è quello che meglio gli si avvicina.
Come distinguere i due Alert? Utilizzando appunto la proprietà tag. Dopo la creazione dell’oggetto alert basta inserire:
1 2 3 4 5 6 7 8 9 10 11 12 13 | // primo alert UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Primo" message:@"Primo Alert" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil,nil]; [alert setTag:1]; // imposto il tag di questo Alert ad 1 [alert show]; [alert release]; // ... // secondo alert UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Secondo" message:@"Secondo Alert" delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil,nil]; [alert setTag:2]; // imposto il tag di questo Alert ad 2 [alert show]; [alert release]; |
Ora modifichiamo l’evento in modo da capire quale Alert è stato chiuso:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // Evento // Cliccandi sul bottone OK degli Alter verrà chiamata questa funzione -(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { switch (alertView.tag) { case 1: // Primo Alert break; case 2: // Secondo Alert break; default: break; } } |
Stessa identica tecnica può essere utilizzata se abbiamo una serie di <a target="_blank" href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIButton_Class/UIButton/UIButton.html">UIButton</a> creati runtime. Ad esempio:
1 2 3 4 5 6 7 8 9 10 | for( unsigned int i=0; i < 10; i++) { UIButton *mybutton = [[UIButton buttonWithType:UIButtonTypeCustom] initWithFrame:CGRectMake(i*20, i*20, 20, 20)]; [mybutton setTitle:@"But" forState:UIControlStateNormal]; [mybutton setTag:i]; // imposto il tag // stesso evento per tutti [mybutton addTarget:self action:@selector(onTouchUpInside:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:mybutton]; } |
Nell’evento onTouchUpInside recuperiamo dal sender (dove eseguiamo un casting <a target="_blank" href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/cl/UIView">UIView</a>) la proprietà <a target="_blank" href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/doc/uid/TP40006816-CH3-SW25">tag</a>:
1 2 3 4 | -(void)onTouchUpInside:(id)sender { unsigned int button_tag = ((UIView *)sender).tag; // todo } |
Very short snippet: visualizzare una lista di post per categoria o tag
Due funzioni utili, personalizzabili a piacere, da usare per mostrare gli ultimi n post di una categoria o per uno o più tag. Le funzioni, come vedrete, sono molto simili e si basano entrambe su un loop generato tramite query_post(). La prima, show_title_cat(), mostra gli ultimi post (in questa versione solo il titolo) di una determinata categoria:
Un tema WordPress per tutti
Sotto al titolo del blog, sulla sinistra, proprio sopra la barra di navigazione, è presente uno “switch”, che permette di passare ad un tema grafico alternativo, più precisamente “chiaro”.
Il tema grafico di un blog viene scelto dal proprietario del blog stesso, sia se lo si è creato a mano, sia se lo si è scaricato dalla rete. Il risultato finale, tuttavia, oltre a soddisfare “noi” proprietari deve essere gradito dai nostri visitatori che non sempre apprezzano determinate scelte di layout. Per alcuni sarà banale, per altri meraviglioso, per altri ancora tremendamente fastidioso! Perché, quindi, non far scegliere al “visitatore” il layout con cui visualizzare il nostro blog?
Hi phone
Da oggi inauguro una nuova sezione (categoria per essere corretti) dedicata allo sviluppo di applicazioni su Apple iPhone! Premetto da subito che molti degli articoli che pubblicherò avranno un “taglio” in linea con lo spirito di questo blog, cioè saranno in maggioranza per utenti avanzati. Tuttavia, come ho già fatto per altri argomenti, cercherò di essere il più chiaro possibile e, dove necessario, inserire qualche “concetto base” utile ad un pubblico più ampio.







Ultimi Commenti
Giovambattista Fazioli: @Nik: Sono contento! In bocca al lupo dunque!!
Nik: Lunedì ho l’esame di informatica su java, grazie mi sei stato utilissimo, il libro che ho era poco chiaro...
Marco: Ti ringrazio moltissimo, mi hai illuminato
ho risolto impostando [cc_objc] //OptionViewController.m -...
Giovambattista Fazioli: @Marco: Ti consiglio un approccio credo più corretto. Se hai eseguito il subclass del tab...
luigi: molto chiaro e semplice devo ammettere che anche scrivendo da un pà difficilmente uso delegati creati da...