2011-04-10 2 views
0

Je pense que je suis un peu confus au sujet de iOS @property getter et setters. J'essaye de placer un iVar de NSString dans mon dossier AppDelegate.h d'une autre classe de sorte qu'il puisse être employé par toutes les classes dans le projet? Par exemple, je travaille sur un projet iPhone qui stocke un utilisateur actuel de NSString * iVar dans AppDelegate.h. Je dois être en mesure de définir cela à travers une méthode dans un ViewController.m puis l'obtenir à travers une autre méthode dans un second ViewController?iOS Getter et Setter confusion

Peut-être que Getter et Setter sont dans la mauvaise direction d'attaque tous ensemble? Je comprends que je ne veux pas allouer init le AppDelegate car l'iVar n'existera que dans cet objet et je veux qu'il soit accessible à TOUS les objets dans TOUTES les classes?

S'il vous plaît, quelquechose me corrige.

Tous les meilleurs, Darren

+0

Il semble que l'utilisation d'un singleton peut être une solution; avez-vous essayé cela? (Bien que je connais quelques personnes qui ne sont pas friands d'utiliser des singletons comme solution) –

+1

Le délégué de l'application agit effectivement comme un singleton. Il n'y a généralement qu'une instance en jeu, et elle est accessible de n'importe où via le singleton UIApplication. Impossible de balancer un chat mort dans iOS sans toucher un singleton ... –

+0

J'ai regardé singleton et pensé qu'il pourrait y avoir un moyen plus simple. J'aime la solution de Bill en utilisant le délégué de l'application. Maintenant, juste pour le faire fonctionner correctement. – EcksMedia

Répondre

1

est ici la configuration pour le délégué de l'application.

@interface AppDelegate 
{ 
    NSString *__currentUser; 
} 
@property (monatomic, copy) NSString* currentUser; 
@end 

@implementation AppDelegate 
@synthesize currentUser = __currentUser; 

- (void) dealloc 
{ 
    [__currentUser release]; 
    [super dealloc]; 
} 
@end 

D'un contrôleur de vue, vous pouvez définir une valeur pour l'utilisateur en cours, et d'un contrôleur de suite vue, obtenir cette valeur dans un but malfaisant.

@implementation LoginController 
- (void) viewDidLoad 
{ 
    ... 
    AppDelegate *bob = [[UIApplication sharedApplication] delegate]; 
    [bob setCurrentUser: @"Jim Kirk"]; 
    ... 
} 
@end 

Dans un autre contrôleur d'affichage qui apparaît plus tard, la valeur de l'utilisateur actuel est accessible.

@implementation ProfileViewController 
- (void) viewDidLoad 
{ 
    ... 
    AppDelegate *bob = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
    NSString * user = [bob currentUser]; 

    // insert nefarious purpose for current user value here 
    ... 
} 
@end 
+0

Hé, merci, Bill, ça m'a presque amené là-bas. Des connaissances vraiment pratiques là-bas. J'ai maintenant mon code pour régler la variable sans problème mais je me demande si vous pourriez en dire un peu plus sur l'accès au Var car votre code ne semble pas correct? – EcksMedia

+0

J'ai mis à jour ma réponse pour faire un cast à AppDelegate *. En fait, vous n'avez peut-être pas besoin du cast puisque la valeur est affectée à une variable locale de type AppDelegate. Ça ne fera pas de mal de l'avoir là-dedans. Une solution courante à l'incantation UIApplication longue est de créer une macro pour elle dans votre fichier d'en-tête de préfixe. #define APP_DELEGATE = (AppDelegate *) [[délégué UIApplication sharedApplication]], puis utilisez APP_DELEGATE chaque fois que nécessaire. Par exemple [APP_DELEGATE currentUser]; –

+0

Grâce au code de Bill, la dernière partie fonctionnait maintenant. Remplacé NSString * user = [[délégué UIApplication sharedApplication]] currentUser]; Par exemple: AppDelegate * user = [[UIApplication sharedApplication] delegate]; NSString * currentUser = user.currentUser; // juste pour prouver que cela fonctionne NSLog (@ "This is the currentUser:% @", currentUser); Merci les gars ceci répond à ma question. Je ne regardais pas vraiment les Getters et les setters correctement. – EcksMedia