2010-04-03 4 views
1

J'ai défini une variable globale appelée à partir d'une autre vue et elle fonctionne la première fois mais pas les suivantes, elle conserve la valeur du premier appel! Supposons que c'est un problème fondamental du cacao et que la variable n'est pas correctement définie selon ses besoins. Merci pour toute idée pour le résoudre.Appel de variable globale ne fonctionnant que la première fois

déclaration:

@interface TableArchiveAppDelegate : NSObject <UIAppDelegate> { 

    NSString  *varName; 
} 

@property (nonatomic, copy) NSString *varName; 

lignes liées, puis sur le fichier .m:

@synthesize varName; 

-(void)test{ 

     varName = textField.text; 
} 

et demande d'une autre vue:

- (void)viewDidLoad { 


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

    name.text = mainDelegate.varName; 

    [super viewDidLoad]; 
} 
+0

Vous ne savez pas exactement quel est le problème. Peut-être pourriez-vous fournir les valeurs que vous voulez voir et quand vous voulez les voir ainsi que les valeurs que vous voyez réellement. – TechZen

+0

Ruthy: 'varName' n'est pas une variable globale ici; vous avez deux choses nommées 'varName', une variable d'instance et l'autre une propriété, toutes deux dans le délégué de votre application. –

Répondre

1

Je ne suis pas certain de comprendre la question, mais le code présenté provoquera la présence de l'attribut varName à partir de textField.text lorsque la méthode -test a été appelée. Si vous ne lui attribuez jamais de valeur différente, il conserve cette valeur initiale pour toujours.

Votre problème est peut-être que vous n'utilisez pas les accesseurs synthétisés.

Ce:

@property (nonatomic, copy) NSString *varName; 

... crée une synthèse accesseur qui copie l'objet NSString qui lui est passé en créant une autre instance NSString et peuplant la valeur de la passe NSString. Cependant, ceci:

varName = textField.text; 

... attribue nomVar à l'adresse de la chaîne tenue à TextField.text. Rien n'est copié. Si le texte textField.text change, varName car les deux iVars partagent la même valeur de chaîne à la même adresse. En outre, lorsque textField.text libère la chaîne, elle disparaîtra également de varName.

Pour copier la chaîne de TextField.text vous devez utiliser:

self.varName = textField.text; 

... pour évoquer la méthode d'accès qui a synthétisé la fonction de copie à l'intérieur.

En général, vous devez toujours utiliser la notation self. lorsque vous faites référence aux propriétés d'une classe pour vous assurer qu'elles sont correctement conservées/copiées/relâchées, etc. La seule exception est, bien sûr, si vous écrivez votre propre accesseur personnalisé.

+0

Salut TechZen, self.varName était la solution! Je suis vraiment reconnaissant pour votre soutien et les étapes claires !! – Ruthy