Nella costruzione delle nostre applicazioni può capitare ( come è accaduto a me ) di avere due View in cui dalla seconda di deve necessariamente modificare delle variabili usate nella prima.
Nel mio caso, in particolare, avevo le necessità, a seconda della pressione di una riga di una tabella, di visualizzare un Picker che modificasse un Dictionary presente nella prima classe ( quella della tabella per intenderci ). Insomma, dovevo usare stesse variabili da classi differenti. Inizialmente pensai di sfruttare le variabili globali ma, come i più reduci dalla programmazione sapranno, la variabili globali sono sempre “in linea di massima” sconsigliate. Le variabili dovrebbero avere, sempre, il campo di applicazione più piccolo possibile. Aumentandolo, infatti, non si farebbe altro che ottenere più codice in grado di modificare potenzialmente la variabile e aumentare la complessità generale del codice, le difficoltà nella correzione di eventuali errori e il riutilizzo dello stesso.

Cercando in rete mi sono imbattuto in una soluzione, secondo me, da tener presente e che ho correttamente utilizzato. In parole povere viene sfruttato il delegate per trasferire i dati tra le classi.

Diamo uno sguardo al codice per capire al meglio le operazioni da compiere.

Innanzitutto diamo per scontato di avere due classi ClasseA e ClasseB.
Nel delegate della nostra applicazione effettuiamo le seguenti dichiarazioni:

#import <UIKit/UIKit.h>
 
@class ClasseA, ClasseB; // Le nostre due classi
 
@interface PickerAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate> {
    UIWindow *window;
    UITabBarController *tabBarController;
    NSMutableString *variabile; // Ammettiamo che sia questa la variabile da condividere
}
 
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;
@property (nonatomic, retain) NSMutableString *variabile;
 
@END

Nel file di implementazione (.m) del nostro Delegate sintetizziamo semplicemente la variabile:

@synthesize variabile;

Accediamo ora alle nostre due classi ClasseA e ClasseB in cui dobbiamo utilizzare la variabile. In queste due classi importiamo il delegate nel solito modo

#import "NostroProgettoDelegate.h"

Dove dobbiamo utilizzare la variabile “condivisa” effettuiamo questa dichiarazione:

NostroProgettoDelegate *mainDelegate = (NostroProgettoDelegate *)[[UIApplication sharedApplication]delegate];

accediamo quindi alla nostra variabile condivisa in questo modo:

mainDelegate.variabile

effettuando su di essa tutte le operazioni necessarie. Nient’altro!

Descriviamo ora brevemente, per concludere, la classe UIApplication:

La UIApplication fornisce un punto centralizzato di controllo per le applicazioni per iPhone OS. Ogni applicazione ha una istanza UIApplication. Quando un’applicazione viene lanciata la UIApplicationMain viene richiamata. Questa classe, tra le altre cose, crea un’oggetto UIApplication singleton ( un’istanza a cui è associato un punto di accesso globale ) a cui è possibile accedere richiamando il metodo della classe sharedApplication. Inoltre la classe UIApplication contiene un metodo che consente di accedere al delegate della nostra applicazione, grazie quindi a questo metodo dell’oggetto, riusciamo ad accedere alla variabile creata nel delegate.