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. P>
6 Réponses :
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: Vous pourriez ensuite redéclaré dans votre fichier .m sans l'extérieur. P> 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 code>. 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. P> p>
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.
Vous pouvez utiliser une instance singleton, disponible dans toutes vos classes, qui gère toutes les informations dont vous avez besoin. P>
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]; }
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: et le setupconfig.m: p> 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
Je ne serais pas trop rapide pour contourner l'encapsulation de données qui est une bonne caractéristique de l'objectif-c. p>
Si vous collectez quelque chose que vous envisagez d'être "Paramètres", envisagez d'utiliser NSUserDefault. P>
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) p>
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) p>
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. P>
Vous pouvez l'utiliser comme un singleton ou vous pouvez le garder dans l'application déléguée et appeler comme [Appdelegate Gestring]; P> blockQuote>