Objective-C ci mette a disposizione una semplice classe attraverso la quale possiamo salvare le preferenze dell'utente nelle nostre app per iPhone e iPad: NSUserDefaults.

Usare questa classe è veramente semplice.

Prima di tutto dobbiamo istanziare l'oggetto:

NSUserDefaults userDefaults = [NSUserDefaults standardUserDefaults];

Poi possiamo facilmente leggere e scrivere all'interno con il classico meccanisco chiave:valore.

Piccolo tip su come usare un font personalizzato una una nostra app per iOS.

Il font in questione può essere uno creato da voi o scaricato; rimane, comunque, che è un font esterno.

Prima di tutto inserite il font nel vostro progetto nella directory Font (se non c'è createla).

Come estensione del font ho usato ttf, e se non se altre estensioni sono supportate.

Di default XCODE ci mette a disposizione solo UIButton con angoli a punta (penso questo dipenda da iOS 7).

Non è detto che noi li vogliamo così, e magari li vogliamo con angoli tondi!

Bhe presto detto.

Una volta che abbiamo aggiunto il bottone alla StoryBoard, e aggiunto il riferimento al controller, non dobbiamo far altro che usare un oggetto CALayer.

Oggi vediamo come scaricare file dalla rete nella nostre app per iPad e iPhone usando gli strumenti standard offerti da iOS.

Partiamo del file di header del nostro controller:

@interface EntrateViewController : UIViewController {
    NSURLConnection *connection;
    NSURLRequest *request;
    NSURL *url;
    NSMutableData *dataResponse;
    NSArray *paths;
    NSString *documentsDirectory;
    NSString *lastEntrateFile;
}

@property (weak, nonatomic) IBOutlet UIBarButtonItem *btnRefresh;

- (IBAction)download:(id)sender;

@end

Abbiamo un UIBarButtonItem, al quale abbiamo collegato una IBAction.

Torniamo a parlare di Objective-C con un argomento abbastanza importante: il controllo della connessione.

Fino a iOS 6 non sono previsti strumenti integrati, ma Apple stessa ha messo a disposizione una classe che si chiama Reachability, che si può scaricare dal web; un esempio completo da qua.

Per questa classe bisogna disabilitare ARC se lo avete attivato; sennò in giro c'è anche una classe compatibile con ARC.

Una volta agguinta la classe al progetto, sviluppiamo una classe per usarla; io l'ho chiamata molto banalmente ControlloConnessione:

// ControlloConnessione.h

#import
#import "Reachability.h"

@interface ControlloConnessione : NSObject {
    Reachability *internet;
    Reachability *wifi;
}

- (BOOL)controllaConnessione;
- (BOOL)check: (Reachability *)curReach;

@end

Questo il file di implementazione:

// ControlloConnessione.m
#import "ControlloConnessione.h"

@implementation ControlloConnessione

- (BOOL)controllaConnessione {
    internet = [Reachability reachabilityForInternetConnection];
    wifi = [Reachability reachabilityForLocalWiFi];
    if ([self check:internet] || [self check:wifi]) {
        return YES;
    }
    return FALSE;
}

- (BOOL)check:(Reachability*)curReach{
    NetworkStatus netStatus = [curReach currentReachabilityStatus];
    switch (netStatus){
        case NotReachable:{
            return NO;
            break;
        }
        case ReachableViaWWAN:{
            return YES;
            break;
        }
        case ReachableViaWiFi:{
            return YES;
            break;
        }
    }
    return FALSE;
}

@end

Come vedete ci sono due metodi, di cui il primo sarà quello richiamato dove ci serve.

Piccolo snippet di codice per identificare la risoluzione in iPhone e iPad da codice.

Useremo tre oggetti: CGRect, CGFloat e CGSize.

Tutto ciò insieme a UIScreen, di sicuro l'elemento più importante dello snippet.

L'esigenza nasce dal datto che nella schermata di registrazione che sto facendo per una app per iPad, devo permettere solo numeri.

Questo perchè il campo corrisponde a quello del numero di telefono.

Per farlo è necessario usare il metodo shouldChangeCharactersInRange; ma andiamo con ordine e partiamo dal file .h:

#import <UIKit/UIKit.h>

@interface ControllerPrivateReg : UIViewController <UITextFieldDelegate>

@property (strong, nonatomic) IBOutlet UITextField *txtTelephone;

@end

Dobbiamo implementare il protocollo UITextFieldDelegate, per il resto non ci serve altro che il riferimento alla nostra UITextField.

In questi giorni mi sono dato alla validazione di un form per una app su iPad.

I controlli erano più o meno i soliti: password, email, codice fiscale, ecc....

Per eseguire questi controlli mi sono creato una classe con dei metodi static da richiamare nel form.

Vi posto uno di questi metodi per vedere come usare le espressioni regolari in Objective-C.

Oggi vediamo come effettuare richieste POST a un file remoto e leggere la risposta con Objective-C (testao su iPhone e iPad).

E' un argomento di assoluta importanza nel mondo mobile, in quanto in molte app è richiesta l'interazione con un database.

Quindi il primo passo è creare dei file su server nel linguaggio che preferite (ad esempio PHP); nel mio caso specifico ho creato un file che mi serve per interogare il db e vedere se l'utente è registrato (lascio a voi la creazione del file lato server).

Nel file .h avremo una cosa del genere:

#import

@interface ControllerLogin : UIViewController {
    NSURLConnection *connection;
    NSMutableURLRequest *request;
    NSURL *url;
    NSMutableData *dataResponse;
    NSMutableString *strResponse;
}

@property (strong, nonatomic) IBOutlet UIButton *btnLogin;
@property (strong, nonatomic) IBOutlet UITextField *txtUser;
@property (strong, nonatomic) IBOutlet UITextField *txtPwd;

- (IBAction)doLogin:(id)sender;

@end

Il metodo doLogin si occuperà di iniziare tutto il processo.

Poi abbiamo diversi tipi di variabili da usare.

Vi posto il file di implementazione a pezzi, mettendo solo ciò che ci interessa.

Abbiamo visto come riempire le UIPickerView usando sia un NSArray sia usando un NSDictionary.

Abbiamo anche visto che leggere un file di testo.

A questo punto mettiamo tutto insieme: da un file di testo riempiamo l'NSDictionary che viene usato dal nostro UIPickerView.

Il file di testo sarà una cosa del genere:

s.c.c. a r.l.;Società Cooperativa Consortile a responsabilità limitata
S.p.A.;Società per Azioni
N.A.;National Association
Cons. a.e.;Consorzio con attività esterna
Cons.;Consorzio
S.c.r.l.;Società Cooperativa responsabilità limitata
soc. consort. n c.;Società Consortile in nome collettivo
coop. soc.;Cooperativa sociale
p. soc. coop.;Piccola Società Cooperativa
s.r.l. unico socio;Società a responsabilità limitata con unico socio
soc. coop. agricola;Società Cooperativa Agricola
S.p.A. Socio Unico;Società per Azioni con Socio Unico
s.r.l. unipersonale;Società unipersonale a responsabilità limitata
L.L.C.;Limited Liability Company
s.a.s.;Società in accomandita semplice
soc. coop. p.A. r.l.;Società cooperativa per Azioni a responsabilità limitata
Soc. Mutua Ass.;Società di Mutua Assicurazione
Cons. a gar. l.;Consorzio a garanzia limitata
Ente Morale;Ente Morale
GmbH;Geselschaft mit Beschränkter Haftung

In pratica ogni riga la spezziamo al punto e virgola e la parte di sinstra sarà la chiave, mentre quella di stra il valore visto sullo schermo.

Prima di tutto aggiungete il file al progetto.

Poi questo sarà il file .h:

#import <UIKit/UIKit.h>

@interface ControllerAziendaReg : UIViewController {    
    NSMutableDictionary *dictionaryForma;
    NSArray *splitArray;
    NSMutableArray *keysForma;
    NSMutableArray *objectsForma;
    NSString *fileTxt;
    NSString *textFromFile;
    UIActionSheet *sheetForma;
}

@property (retain, nonatomic) IBOutlet UIPickerView *pickerForma;

@end

Il file .m ve lo spezzo in modo da rendere più chiaro il tutto.