2

J'ai plusieurs contrôleurs d'interface qui sont ouverts en même temps dans un format paginé. J'ai besoin de partager des informations entre ces contrôleurs d'interface.Comment puis-je partager des variables entre plusieurs contrôleurs d'interface dans une interface paginée sur watchOS?

Pour mon cas d'utilisation, je ne peux pas forcer l'utilisateur à l'un des autres contrôleurs d'interface (en initiant une section), donc ces solutions ne fonctionneront pas pour moi. Je dois pouvoir changer certaines variables dans l'un ou l'autre contrôleur, et accéder à ces variables dans l'un ou l'autre contrôleur.

J'essayé de placer directement une variable dans un contrôleur d'interface qui n'est pas visible de cette façon:

InterfaceController2().variable = false 

Mais, cela ne fonctionne pas (comme prévu) puisque ce n'accède pas à l'instance actuellement instancié de ce contrôleur d'interface.

Je considère une sorte de situation de variable globale, ou de stocker des préférences dans UserDefaults, mais je pense qu'il doit y avoir un meilleur moyen.

+2

utilisez un singleton. https://stackoverflow.com/q/32660471/294884 – Fattie

Répondre

1

Meilleure option: Si vos contrôleurs ont un parent commun, vous pouvez utiliser des méthodes déléguées pour transmettre/extraire des valeurs du parent commun. Alt: Vous pouvez créer une instance partagée qui stocke vos valeurs et vos contrôleurs peuvent mettre à jour/récupérer la valeur à partir de là.

Option finale: C'est un peu grossier, mais vous pouvez utiliser NSNotificationCenter. (a) ajouter des observateurs dans tous vos contrôleurs, (b) publier des notifications chaque fois qu'une valeur est mise à jour. Et puis (c) mettre à jour les valeurs locales dans vos contrôleurs dans les gestionnaires de notification.

+1

ne pouvait pas être plus simple, utilisez un singleton. presque tout dans l'ingénierie iOS est un singleton (commençant dans, notamment, "l'application"!) – Fattie

+0

Je vais aller avec singletons (la suggestion Alt), mais je peux voir comment ces autres méthodes seraient mieux dans des cas similaires. – wazawoo

1

Vous pouvez utiliser un singleton. Le moyen le plus simple de créer un singleton est de faire de la variable que vous souhaitez partager entre InterfaceControllers une propriété class/static.

Vous pouvez le créer comme ceci:

class CommonClass { 
    static var mySingleton = true 
} 

accéder ensuite de vos InterfaceController s comme ceci: CommonClass.mySingleton = false. Vous devez être prudent lorsque vous utilisez des singletons, car ils peuvent être accédés n'importe où à partir de votre code, de sorte qu'ils peuvent être utilisés à mauvais escient pour agir comme des variables globales, qui peuvent avoir ses pièges.

Consultez l'article this pour plus de détails sur les singletons.