8
votes

Passer une variable entre beaucoup d'UIViewControlers

Dans mon application iPhone, il existe un assistant d'installation qui aide les utilisateurs à saisir beaucoup de données. Il s'agit essentiellement d'une commande UINAVIGATION avec beaucoup d'UIViewControls. Maintenant, à un moment donné, je souhaite accéder à une variable que l'utilisateur est entré dans le premier UIViewController qu'il a vu. Je pourrais transmettre la variable entre chaque UIViewController avec une méthode de setter, mais je suppose qu'il y a un moyen plus facile.


0 commentaires

6 Réponses :


7
votes

Vous pouvez déclarer des variables globales ou de classe dans le style C si vous le souhaitez. Si vous souhaitez que la même variable soit disponible dans plusieurs de vos sous-classes d'UIViewController, vous le déclareriez comme une variable externe dans le fichier .h de votre premier contrôleur, par exemple: xxx

Vous pourriez ensuite redéclaré dans votre fichier .m sans l'extérieur. xxx

Vous ne devez pas la redéclaré dans l'autre .m ou .h fichiers, mais vous pouvez Accédez à la variable dans tous les fichiers qui importent myFirsSviewController.h . Lors du réglage de la variable, prenez soin de la libération et de la conserver correctement. Il est facile de créer une fuite de mémoire avec ce type de variable globale.


2 commentaires

N'a-je pas obligé de stocker un pointeur vers l'original MyFirsviewController pour y accéder?


Non, vous n'avez pas à stocker aucun pointeur sur des objets pour accéder à ce type de variable, mais vous n'obtenez qu'une seule instance et elle est partagée entre tous vos objets.



1
votes

Vous pouvez utiliser une instance singleton, disponible dans toutes vos classes, qui gère toutes les informations dont vous avez besoin.

singleton dans l'objectif-c, Wikipedia


0 commentaires

3
votes

YA, il y a beaucoup un moyen facile de gérer cela .....

Vous pouvez prendre une variable globale p>

dans votre délégué.h Dossier de votre variable: P> XXX PRE>

Deuxièmement dans Délégué.M Fichier P>

- (void)viewDidLoad {
    [super viewDidLoad];

    appDel=[[UIApplication sharedApplication]delegate];

}


0 commentaires

3
votes

Un moyen simple mais réutilisable et extensible de résoudre ce problème consiste à utiliser un singleton.

Déclarez une nouvelle classe nommée SETUPCONFIG, par exemple. P>

Votre setupconfig.h devrait ensuite regarder comme suit: xxx pré>

et le setupconfig.m: p> xxx pré>

maintenant, dans la mise en œuvre du contrôleur d'affichage, vous souhaitez accéder à MyString de: p>

@import "MyViewController.h"
@import "SetupConfig.h"

@implementation MyViewController

- (void)methodDoingSomethingWithSingletonString
{
    NSString *myString = [[SetupConfig sharedSetupConfig] myString];
} 

@end


0 commentaires

0
votes

Je ne serais pas trop rapide pour contourner l'encapsulation de données qui est une bonne caractéristique de l'objectif-c.

Si vous collectez quelque chose que vous envisagez d'être "Paramètres", envisagez d'utiliser NSUserDefault.

Si vos points de vue se déroulent d'une structure à la suivante suivante, envisagez de faire une classe "Données", peu importe que vous faites, puis transmettez-la de la vue parent à la sous-vision jusqu'à ce que vous arriviez là-bas. (N'oubliez pas que «passer» n'est pas une opération coûteuse, le matériel reste mis, vous passez un petit pointeur)

Si vous voulez vraiment la route singleton, envisagez de faire une propriété du délégué de l'application (un singleton déjà existant)

N'oubliez pas que seul la voie de «passage in» Les données confèrent l'avantage supplémentaire que plus tard, vous voudrez peut-être collecter ces informations de départ plusieurs fois et lancez différentes vues possibles, et il est trivial de passer à un différent. Si vous allez la route globale, vous devrez commencer à ré-écrire partout où vous l'avez accédé auparavant.


0 commentaires

0
votes

Vous pouvez l'utiliser comme un singleton ou vous pouvez le garder dans l'application déléguée et appeler comme [Appdelegate Gestring];


0 commentaires