Articoli con Tag ‘NSString’


Very short snippet: NSConnection in POST con parametri

L’oggetto NSMutableURLRequest può essere utilizzato sia in modalità GET che in modalità POST. I parametri, tuttavia, vanno formattati come se fossero in GET, cioè nella sequenza nome_campo1=valore1&nome_campo2=valore2&.... Ecco un utile snippet per semplificare la costruzione di campi:

Continua...

10 utili snippet Objective-C

Spostare il doppio Tap sul simulatore

Il simulatore iPhone/iPad in Xcode permette di simulare il doppio tap con la pressione del tasto ALT. Questo è utile per simulare anche la funzione di Pinch, quella usata per ingrandire o allontare contenuti nelle view con scroll o in oggetti UIWebView. Ebbene, alcuni di voi avranno notato che la simulazione delle “due dita” procede in modo simmetrico partendo sempre dal centro dello schermo. Per muovere questo “centro” è sufficiente tenere premuto anche il tasto SHIFT.

Continua...

Come sviluppare in PHP con Xcode e Objective-C

Come molti programmatori usano fare, anch’io mi costruisco le mie librerie di funzioni pronte per essere riutilizzate in più progetti e in più contesti. Lasciatemi passare il titolo di questo post, forse un po’ azzardato ma, tuttavia, come vedremo, non lontano dalla realtà.

In Objective-C è possibile scrivere e chiamare codice C/C++, compreso l’assembly se è per questo. Questa sua caratteristica lo rende un linguaggio davvero versatile e, per certi aspetti, fenomenale. Da un lato, infatti, è possibile utilizzare e apprezzare la sintassi prettamente Objective-C, dall’altro è possibile eseguire velocemente porting di codice scritto in ANSI C (magari per Digital Unix o Sun) e utilizzarlo comodamente nelle nostre applicazioni iPhone o iPad; per non parlare di tutto il Kernel BSD già disponibile su Mac OS X!

Continua...

Very short snippet: NSURL, varie ed eventuali

Restituisce il nome di un file a partire dall’oggetto NSURLRequest, permettendo di decidere se avere o meno la sue estensione:

Continua...

NSString

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...

Come ottenere Latitudine e Longitudine in Objective-C

Il MapKit framework fornisce moltissime funzionalità utili, tranne quella di restituire Longitudine e Latitudine a partire da un indirizzo. In Javascript, ad esempio, è possibile utilizzare il servizio di Geocoding fornito da Google e discusso in Google Maps: come ottenere Latitudine e Longitudine da un indirizzo. Su Apple iPhone, o iPad, è possibile tuttavia superare l’ostacolo utilizzando in modo diverso i servizi di Google. Nello specifico è possibile chiamare direttamente l’url:

1
http://maps.google.com/maps/geo?q=[indirizzo]&output=csv

Dove è [indirizzo] inserire la stringa con l’indirizzo che vogliamo trasformare in coordinate. L’output restituito è del tipo:

1
200,8,41.9128300,12.2241172

Il primo valore, 200, indica che tutto è andato bene (200 OK). Il secondo, 8, è il Google accuracy parameter (1-10). Gli ultimi due valori sono, finalmente, latitudine e longitudine. Vediamo adesso un possibile prototipo di un metodo da inserire nelle nostre applicazioni:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
- (CLLocationCoordinate2D)getLocationFromAddress:(NSString*)address {
    NSString *urlString = [NSString stringWithFormat:@"http://maps.google.com/maps/geo?q=%@&output=csv",
          [address stringByAddingPercentEscapesUsingEncoding: NSUTF8StringEncoding]];
    NSString *locationString = [[[NSString alloc] initWithContentsOfURL:[NSURL URLWithString:urlString]] autorelease];
    NSArray *listItems = [locationString componentsSeparatedByString:@","];
 
    //int zoom       = 0;
    double latitude  = 0.0;
    double longitude = 0.0;
 
    if([listItems count] >= 4 && [[listItems objectAtIndex:0] isEqualToString:@"200"]) {
        //zoom    = [[listItems objectAtIndex:1] intValue];
        latitude  = [[listItems objectAtIndex:2] doubleValue];
        longitude = [[listItems objectAtIndex:3] doubleValue];
    } else {
        // Errore
    }
    CLLocationCoordinate2D location;
    location.latitude  = latitude;
    location.longitude = longitude;
 
    return location; 
}

Note interessanti

La stringa restituita in locationString viene “splittata” tramite il metodo componentsSeparatedByString, alla stregua della funzione explode() del PHP per intenderci. Nell’esempio da me proposto ho inserito – ma commentato – il codice per recuperare anche il Google accuracy parameter, o fattore di scala di precisione, indicato con zoom.

Sorgente esempio

Per completezza ho realizzato un piccolo applicativo di esempio con il quale è possibile provare il metodo sopra proposto; inserite un qualsiasi indirizzo e iPhone lo mostrerà sulla mappa.


Scarica Sorgente

Ringrazio il team di devAPP per l’ispirazione di questo articolo.

Continua...

Very short snippet: ottenere l’output di un URL in Objective-C

Avrei forse dovuto scrivere “Very very very, short snippet”, tuttavia è un ottimo e comodissimo “trucchetto” questo che sto per mostrare. Eseguendo le “due” righe di codice indicate qui sotto, è possibile ottenere l’output di qualsiasi URL e manipolarlo.

Continua...

Objective-C: NSLog() su struct C

La sintassi NSLog(@"%@", ... ); funziona ed è utilizzata per ottenere informazioni sugli oggetti, ma non funziona su tipi dato C come struct CGRect o CGPoint, ad esempio. Per poter sfruttare NSLog(@"%@", ... ); anche su struct di tipo C possiamo appoggiarci a funzioni di conversione come NSStringFromCGRect() o NSStringFromCGPoint:

1
2
3
4
5
CGrect mioRect = (CGRect){10,20,30,40};
CGPoint mioPoint = (CGPoint){32,64};
//
NSLog( @"Info rettangolo: %@", NSStringFromCGRect(mioRect) );
NSLog( @"Info point: %@", NSStringFromCGPoint(mioPoint) );

Nello specifico è possibile perfezionare tale procedure scrivendosi delle piccole macro utili come:

1
#define NSLogRect(rect) NSLog(@"%s: (%0.0f, %0.0f) %0.0f x %0.0f", #rect, rect.origin.x, rect.origin.y, rect.size.width, rect.size.height)

Oppure:

1
2
3
4
#define NSLogCGPoint(point) NSLog(@"%s: (%0.0f, %0.0f)", #point point.x, point.y)

CGPoint mioPoint = (CGPoint){32,64};
NSLogCGPoint(mioPoint);

Che darà come output:

1
mioPoint: (32, 64)

Continua...

iPhone SecondApp: indovina il numero – parte 2

Come anticipato in iPhone FirstApp: indovina il numero – parte 1 vediamo come realizzare un’applicazione per Apple iPhone senza usare Interface Builder! Anzi, elimineremo fisicamente i file di Interface Builder creati dal wizard di Xcode. Alla fine di questo post, quindi, avremo un’applicazione identica, in tutto e per tutto, a quella realizzata nella parte prima, con la differenza che realizzeremo tutti i nostri componenti visivi, compresa la Window principale, completamente da codice.

L’applicazione già fatta, se volete solo scaricarla, è disponibile sul mio Google Code repository:

Vorrei far notare da subito come lo ZIP di questo esempio pesi meno di quello della scorsa volta! :)

Creiamo il progetto

Iniziamo creando il nostro progetto SecondApp (per distinguerlo da FirstApp), anche se questa volta sceglieremo Window-based Application:

newproject

Adesso andiamo ad eliminare tutto ciò che riguarda Interface Builder. Eliminiamo il file MainWindow.xib, situato nella cartella Resources: eliminatelo anche dal file system, quindi selezionate Also Move to Trash. Selezionate, poi, il file SecondoApp-info.plist ed eliminate il riferimento alla MainWindow nella casella Main nib file base name:

deleteib

A questo punto non abbiamo più nessuna Window, almeno tramite Interface Builder. Quindi apriamo il file main.m, situato in Other Sources, e modifichiamo la funzione main() in questo modo:

1
2
3
4
5
6
7
8
9
10
11
int main(int argc, char *argv[]) {
   
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
 
    // avendo eliminato il file .xib abbiamo perso il puntamento
    // all'app delegate, quindi lo passiamo a "mano"
    int retVal = UIApplicationMain(argc, argv, nil, @"SecondAppAppDelegate");

    [pool release];
    return retVal;
}

Apriamo quindi SecondAppAppDelegate.m e creiamo la Window principale via codice:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
- (void)applicationDidFinishLaunching:(UIApplication *)application {    

    // ottiene le dimensioni delle schermo (320, 480)
    CGRect windowRect = [[UIScreen mainScreen] applicationFrame];
    // creiamo una finestra - visto che abbiamo fatto bye bye a Interface Builder
    UIWindow *mainWindow = [[UIWindow alloc] initWithFrame:windowRect];
    // impostiamo il background della Window a giallo, per differenziarlo
    // dalla precedente applicazione FirstApp
    [mainWindow setBackgroundColor:[UIColor yellowColor]];
 
    [self setWindow:mainWindow];
    [window makeKeyAndVisible];
 
    [mainWindow release];
}

Potete già provare l’applicazione; se appare una window gialla avete fatto tutto bene!

Nel file SecondAppAppDelegate.h possiamo eliminare IBOutlet, necessario solo se si usa Interface Builder. Inoltre aggiungiamo qui le nostre variabili globali che, nella scorsa volta, avevamo inserito nel Controller. Modifichiamo quindi il file SecondAppAppDelegate.h:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#import <UIKit/UIKit.h>

@interface SecondAppAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
 
    UITextField *numero;
    UIButton *bottone;
    int numeroACaso;
}

@property (nonatomic, retain) UIWindow *window;

- (void)controllaNumero;

@end

Anche in questo caso abbiamo preparato la definizione del metodo controllaNumero, come la scorsa volta, ma abbiamo eliminato l’indicazione IBAction, in quanto non stiamo usando Interface Builder.

Costruiamo l’interfaccia da codice

E’ giunto il momento di creare tramite codice tutti i componenti della nostra interfaccia. Torniamo nel file SecondAppAppDelegate.m, posizioniamoci prima del [mainWindow release] ed inseriamo il seguente codice:

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
// crea la barra del titolo
UINavigationBar *myNavigationBar = [[UINavigationBar alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 44.0)];
myNavigationBar.barStyle = UIBarStyleDefault;
UINavigationItem *navigationItem = [[UINavigationItem alloc] initWithTitle:@"Indovina un numero"];
[myNavigationBar pushNavigationItem:navigationItem animated:NO];
[window addSubview:myNavigationBar];
 
// crea la label
UILabel *myLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 50, 300, 80)];
myLabel.backgroundColor = [UIColor clearColor];
myLabel.numberOfLines = 2;
myLabel.text = @"iPhone ha pensato un numero da 1 a 10, prova ad indovinarlo?";
[window addSubview:myLabel];
 
// crea il text input
numero = [[UITextField alloc] initWithFrame:CGRectMake(10, 120, 300, 30)];
numero.borderStyle = UITextBorderStyleRoundedRect;
numero.textAlignment = UITextAlignmentCenter;
numero.keyboardType = UIKeyboardTypeNumberPad;
numero.placeholder = @"Inserisci il numero";
[window addSubview:numero];
 
// crea il bottone
bottone = [UIButton buttonWithType:UIButtonTypeRoundedRect];
bottone.frame = CGRectMake(10, 180, 300, 30);
[bottone setTitle:@"Premi qui" forState:UIControlStateNormal];
[bottone addTarget:self action:@selector(controllaNumero) forControlEvents:UIControlEventTouchUpInside];
[window addSubview:bottone];
 
[myLabel release];
[navigationItem release];
[myNavigationBar release];

Dato che l’applicationDidFinishLaunching corrisponde alla viewDidLoad della scorsa volta, subito dopo il [mainWindow release]; inseriamo:

1
numeroACaso = 1 + arc4random() % 10;

Ora non ci rimane che implementare il metodo controllaNumero, che sarà identico (a parte il prototipo) a quello usato la scorsa volta:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
- (void) controllaNumero {
    NSLog(@"Premuto bottone di controlla numero");
    int numeroInserito = [numero.text integerValue];
    NSString *message;
    NSLog(@"Il numero inserito è %d", numeroInserito );
    if( numeroInserito <numeroACaso ) {
        message = @"Troppo basso...";
    } else if (numeroInserito> numeroACaso ) {
        message = @"Troppo alto...";
    } else if (numeroInserito == numeroACaso ) {
        message = @"Bravo hai indovinato";
        numeroACaso = 1 + arc4random() % 10;
        NSLog(@"Numero pensato %d", numeroACaso);
    }
    UIAlertView *alertMessaggio = [[UIAlertView alloc]
                initWithTitle:@"Responso"
                message: message
                delegate:nil
                cancelButtonTitle:@"OK"
                otherButtonTitles:nil];
    [alertMessaggio show];
    [alertMessaggio release];
    numero.text = @"";
}

Abbiamo finito!

Conclusioni e considerazioni

Questo esempio non fa uso diretto di una UIView o di un UIViewController, proprio perchè volevo lasciarlo il più semplice e snello possibile e, anche, per dimostrare che non sono elementi sempre necessari. Tuttavia inserire gli oggetti direttamente nella window può avere un qualche senso in questo esempio ed in altri sporadici contesti. L’uso delle UIView e dei UIViewController portano comunque benefici in tantissimi altri casi, ein alcuni sono praticamente indispensabili; come avremo modo di vedere in futuro.

Continua...

iPhone FirstApp: indovina il numero – parte 1

Il primo sorgente che mi è passato tra le mani era scritto in Basic e consisteva in poche righe di codice, per me illuminanti. Era un semplice giochino che generava un numero casuale da 1 a 10 e, tramite l’input da tastiera, verificava che il numero inserito era maggione, minore o uguale al numero casuale. Nonostante la sua rozza semplicità rimane, per me, uno dei migliori esempi – semplici, divertenti e pratici – per spiegare a chi non sa nulla di programmazione cosa s’intenda effettivamente per “programma per computer”. Così ho pensato di riproporlo per Apple iPhone, magari aiuterà qualcuno…

Continua...