NSURLConnection permette di eseguire una connessione cotrollata verso un server remoto. Per utilizzarlo basta:
1 2 3 4 5 6 7 8 9 10 11
| // Gli oggetti sufficienti per eseguire una NSURLConnection
NSURLConnection *urlConnection;
NSMutableData *mutableData;
// ...
NSString *urlString = @"http://www.miodominio.com/documento.txt";
NSURLRequest *urlRequest = [NSURLRequest requestWithURL :[NSURL URLWithString : urlString ]];
// Il delegato risponderà agli stati della connessione
urlConnection = [[NSURLConnection alloc ] initWithRequest : urlRequest delegate :self ]; |
Ecco i metodi delegati per controllare lo stato della connessione:
[cc_objc]
Continua...
Objective-C è un linguaggio meraviglioso che permette di fare cose incredibili. Uno degli aspetti più interessanti è la sua dinamicità nell’invocazione di metodi (messaggi). È possibile, infatti, ottenere l’indirizzo di un messaggio partendo da una stringa.
Continua...
L’oggetto UIWebView può essere utilizzato per la visualizzazione di numerosi file. Ad esempio è possibile utilizzarlo per visualizzare – oltre che a filmati QuickTime o YouTube – documenti PDF o file HTML inseriti all’interno del nostro codice.
Continua...
NSString è una classe potentissima, lasciatemi mostrare alcune delle proprietà più utilizzate:
printf()
1 2
| // printf()
NSString *output = [NSString stringWithFormat :@"%@ / %@", @"primo", @"secondo"]; |
Eseguire lo split()
1 2 3
| // split() / explode()
NSString *list = @"Norman, Stanley, Fletcher";
NSArray *listItems = [list componentsSeparatedByString :@", "]; |
Convertire da stringa a valore
1 2 3
| // converting
NSString *doubleString = @"123";
double value = [doubleString doubleValue ]; |
All’interno di una stringa
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| // substring
NSString *searchString = @"age";
NSString *beginsTest = @"Agencies";
NSRange prefixRange = [beginsTest rangeOfString :searchString
options :(NSAnchoredSearch | NSCaseInsensitiveSearch )];
// prefixRange = {0, 3}
NSString *endsTest = @"BRICOLAGE";
NSRange suffixRange = [endsTest rangeOfString :searchString
options :(NSAnchoredSearch | NSCaseInsensitiveSearch | NSBackwardsSearch )];
// suffixRange = {6, 3} |
Continua...
Per comporre email all’interno di una applicazione iPhone/iPod è sufficiente aggiungere il framework MessageUI. Nel nostro controller inserire l’inclusione del framework e adottare il protocolo MFMailComposeViewControllerDelegate:
Continua...
Quando definiamo o utilizziamo metodi (messaggi) in ambiente Objective-C, ci troviamo spesso di fronte alla curiosa sintassi che si presenta con un simbolo - o + davanti al prototipo, tipo:
1 2 3 4 5 6 7
| // Nella definizione
- (void)mioMessaggio;
// Ugualmente, nell'implementazione
- (void)mioMessaggio {
// ...
} |
Oppure:
1 2 3 4 5 6 7
| // Nella definizione
+ (void)mioMessaggio;
// Ugualmente, nell'implementazione
+ (void)mioMessaggio {
// ...
} |
La differenza risiede nel fatto che i metodi definiti con il simbolo - sono metodi di instanza, legati quindi ad un oggetto. I metodi definiti con il simbolo + sono chiamati metodi di Classe, in quanto possono essere eseguiti senza allocare ed istanziare l’oggetto in questione.
NSString o UIView sono due classi, molto usate, che contengono svariati metodi di classe. I metodi di classe vengono utilizzati continuamente, come quando inizializziamo o allochiamo un qualsiasi oggetto:
1
| UIView *myView = [UIView alloc]; |
Il metodo alloc è un esempio classico, presente in tutti gli oggetti e, come si evince dal codice, è un metodo di classe in quanto invocato prima dell’allocazione dell’oggetto vero e proprio.
I metodi di classe possono essere utili in moltissimi casi, in particolare quando creiamo un nostro oggetto e desideriamo allocarlo ed inizializzarlo in meno righe di codice possibile. Immaginiamo di dover collezionare in un array una serie di oggetti da noi definiti. Definiamo prima di tutto il nostro oggetto, scrivendo il codice nel modo più semplice, senza utilizzare metodi di classe:
1 2 3 4 5 6 7 8 9 10
| // Definizion l'interfaccia in myObject.h
#import <Foundation/Foundation.h>
@interface myObject : NSObject {
NSString *name;
NSString *lastname;
}
@property(nonatomic, retain ) NSString *name;
@property(nonatomic, retain ) NSString *lastname; |
L’implementazione, nel caso più semplice, potrebbe risultare nulla o:
1 2 3 4 5 6 7 8 9 10 11 12
| // myObject.m
#import "myObject.h"
@implementation myObject
@synthesize name, lastname;
- (void)dealloc {
[name release];
[lastname release];
[super dealloc];
} |
Quando andremo ad usare il nostro oggetto, ci troveremo ad utilizzare un codice simile a questo:
1 2 3
| myObject *obj = [myObject alloc];
obj.name = @"Mario";
obj.lastname = @"Rossi"; |
Se volessimo creare numerosi oggetti di questo tipo, e inserirli in un NSArray, la situazione diventa un poco imbarazzante:
1 2 3 4 5 6 7 8 9 10 11 12
| myObject *objA = [myObject alloc ];
objA.name = @"Mario";
objA.lastname = @"Rossi";
myObject *objB = [myObject alloc ];
objB.name = @"Carlo";
objB.lastname = @"Bianchi";
NSArray *elenco = [NSArray arrayWithObjects : objA, objB, nil];
[objA release ];
[objB release ]; |
Si potrebbe migliorare il codice creando un ciclo for o utilizzando un NSMutableArray per aggiungere man mano gli oggetti nel nostro elenco. Tuttavia la situazione migliorebbe di poco, in quando rimarrebbero fuori le impostazioni delle proprietà name e lastname. Verrebbe quindi spontaneo, per iniziare, aggiungere un metodo – di oggetto – initWithName che consentirebbe di passare immediatamente le impostazioni delle proprietà, semplificandoci un pochino le cose. Nel file di implementazione myObject.m aggiungiamo:
1 2 3 4 5 6 7
| - (id)initWithName :(NSString *)stringName lastname :(NSString *)stringLastname {
if ( self = [super init ] ) {
self.name = stringName;
self.lastname = stringLastname;
}
return self;
} |
Così facendo abbiamo migliorato la situazione, potendo ora scrivere:
1 2 3 4 5 6 7
| myObject *objA = [[myObject alloc ] initWithName : @"Mario" lastname : @"Rossi"];
myObject *objB = [[myObject alloc ] initWithName : @"Carlo" lastname : @"Bianchi"];
NSArray *elenco = [NSArray arrayWithObjects : objA, objB, nil];
[objA release ];
[objB release ]; |
Abbiammo tuttavia ancora i puntatori objA e objB, necessari per l’inserimento nell’array e liberare la memoria. Volendo potremmo inserire direttamente la creazione di un oggetto nel popolamento dell’array, utilizzando autorelease per liberare la memoria, ma il codice sarebbe ancora non al minimo. Lasciatemi mostrare come risolvere la questione con un metodo di classe. Prima di tutto sostituiamo la nostra - (id)initWidthName con:
1 2 3 4 5 6 7 8 9 10
| + (id)initWithName :(NSString *)name lastname :(NSString *)lastname {
myObject *item;
if ( item = [[self alloc ] init ] ) {
// Init
item.name = name;
item.lastname = lastname;
}
return [item autorelease ];
} |
Così facendo abbiamo creato un metodo di classe che alloca (in autorelase) e iniziallizza un nostro oggetto, prima di avere il puntatore all’istanza. Il codice di utilizzo diventa quindi:
1 2 3 4
| NSArray *elenco = [NSArray arrayWithObjects :
[myObject initWithName : @"Mario" lastname : @"Rossi"],
[myObject initWithName : @"Carlo" lastname : @"Bianchi"],
nil]; |
Molto, molto meglio…
Continua...
Su Apple iPhone e iPod eravamo abituati a gestire un solo file immagine al caricamento dell’applicazione, il file Default.png. Su Apple iPad, invece, la diversa gestione dell’orientamente impone l’adozione di più file immagine, per essere certi di visualizzare lo splash screen corretto in base all’orientamente del dispositivo. Durante l’avvio dell’applicazione, come accadeva per iPhone, non è infatti possibile intervenire da codice per “chiedersi” com’è orientato il dispositivo. Fortunatamente è stato introdotto in automatico il caricamento di speciali file a seconda dell’orientamento:

I file attualmente supportati, oltre al classico Default.png che sconsiglio di utilizzare in quanto viene ridimensionato e deformato in base all’orientamento, sono:
- Default-Portrait.png
- Default-PortraitUpsideDown.png
- Default-Landscape.png
- Default-LandscapeLeft.png
- Default-LandscapeRight.png
Le versioni PortraitUpsideDown, LandscapeLeft e LandscapeRight possono essere utilizzate per determinare orietamento e verso di quest’ultimo.
Ad applicazione avviata, poi, come consigliato da Apple, è bene “ridisegnare” – ove necessario – le nostre viste agendo all’interno di application:didFinishLaunchingWithOptions.
Continua...
Con l’uscita di WordPress 3.0 molte cose cambieranno per noi sviluppatori. Gli aggiornamente di questa major release sono tanti e davvero utili a chi sviluppa con questo CMS ormai davvero completo. Potremmo dire che si chiude un’era e se ne apre una nuova e densa di possibilià. Rendo quindi omaggio alle precedenti versioni con una serie di utili snippet alcuni ancora validissimi con la nuova release.
Continua...
Lasciatemi mostrare com’è possibile implementare un semplice Slideshow di immagini con pochissime righe di codice, sfruttando jQuery.
Questa tecnica può essere implementata su qualsiasi tipo di sito Web, la cosa importante è includere la libreria jQuery. Ho usato questa tecnica per un sito realizzato in WordPress, sviluppato in poche ore per un evento.
Continua...
A volte può tornare utile includere in una pagina il contenuto di un’altra. Ad esempio se avete creato una pagina di registrazione e volote mostrare in un riquadro l’informativa della privacy, sarebbe comodo poter caricare questo contenuto da una pagina esistente. Questo ha il vantaggio:
- Il cliente può modificare il contenuto della pagina senza “tocccare” la pagina originale che lo contiene
- La pagina funziona anche da sola, quindi è possibile inserire nel footer del sito un link a “privacy” ad esempio
Il modo migliore per includere il contenuto di una o più pagine è il seguente:
1 2 3
| $postID = get_page_by_title("Privacy")->ID;
$post = get_post(&$postID);
echo apply_filters("the_content",$post->post_content); |
L’ID del Post (della pagina nell’esempio di sopra) è ottenuto tramite il suo titolo sia per chiarezza che per compatibilità con export o reindicizzazioni involontarie.
Continua...
Ultimi Commenti
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...
Marco: Scusa lo spam.. ho notato che c’è un errore.. ecco la correzione [cc_objc] /** PrimaClasse.h **/ #import...
Marco: dimenticato.. in [cci]OptionViewController[/cci ] il [cci]@syntetize[/cci] del delegato l’ho messo
luigi: molto chiaro e semplice devo ammettere che anche scrivendo da un pà difficilmente uso delegati creati da...