2016-02-01 1 views
1

J'ai une classe appelée Sentence et je voudrais définir la propriété text de mon @IBOutlet dans mon ViewController dans l'une des méthodes de Sentence. Est-ce possible? Sinon, dans la méthode de classe Sentence elle-même, comment puis-je faire un appel ou une fonction qui définit mon texte @IBOutlet à partir de la méthode de classe?Comment définir un texte @IBOutlet à partir d'une méthode de classe

Voici mon UILabel

@IBOutlet weak var kleinGrossLabel: UILabel!

+0

@MikeG Cela ne résout aucun des problèmes présentés par cette question, par exemple comment définir correctement le texte d'une classe qui n'a pas d'accès direct à kleinGrossLabel. –

+0

@WillM.J'ai mal lu la question, merci pour les heads up – MikeG

Répondre

5

Vous ne pouvez pas affecter un IBOutlet d'un UIViewController dans une méthode de classe d'une autre classe. Comment cette autre classe (dans votre cas Sentence) est-elle supposée connaître le contrôleur de vue?

Vous avez quelques options:

  1. conserver une référence à votre contrôleur de vue dans votre objet Sentence.
  2. Utilisation de la délégation: définissez un délégué sur votre instance Sentence qui pointe vers le contrôleur de vue et demandez à l'une des méthodes de protocole d'accéder au contenu du IBOutlet.
  3. Utilisez NSNotificationCenter pour envoyer une notification de votre objet Sentence que votre contrôleur de vue écoute, et pouvez mettre à jour son IBOutlet directement.
+0

Merci JAL. Lequel des trois suivants est la meilleure pratique? Ou, si l'équivalent, lequel utiliseriez-vous personnellement? – Thalatta

+1

http://stackoverflow.com/questions/1927965/nsnotificationcenter-vs-delegation-using-protocols a de bonnes infos –

+0

Les "bonnes pratiques" ne sont généralement pas bonnes pour Stack Overflow, car elles sont principalement basées sur l'opinion. Il s'agit de trouver l'option qui convient le mieux à l'architecture de votre application. La délégation est un modèle populaire dans la programmation iOS, bien que les notifications soient probablement les plus faciles à utiliser. Je ne recommanderais pas de garder une référence (option 1). – JAL

3

Le couplage serré serait quand une classe comme Sentence, assume une responsabilité pour quelque chose en dehors de sa préoccupation, comme la sortie d'un contrôleur de vue.

Ces types de modifications peuvent être difficiles à localiser, car il n'est pas évident de savoir où l'état a été modifié. Bien que vous puissiez coupler Sentence en utilisant la délégation ou la notification, cela compliquerait encore les tests (unitaires ou d'interface utilisateur), ainsi que la prise en charge et la maintenance de votre code, lorsqu'une classe (in) affecte directement le état d'une autre classe.

Une autre façon

Vous pouvez déplacer cette responsabilité de Sentence en fournissant une méthode publique pour Sentence qui retourne la propriété désirée. En établissant une frontière d'interface claire comme celle-ci, votre code peut être plus modulaire, vous permettant d'apporter des modifications à l'implémentation de Phrase ou aux prises du contrôleur de vue, sans affecter quelque chose dans l'autre classe.

Il permet également au contrôleur de vue (à partir d'une perspective MVC) d'être seul responsable de la modification de la propriété de texte de la vue. Maintenant, à partir du contrôleur de vue, vous pouvez appeler la méthode publique d'une instance de phrase, puis définir la propriété de texte IBOutlet du contrôleur de vue en fonction de la valeur renvoyée. Cela rendra évident où et pourquoi le texte a changé, au lieu de cacher ce changement dans une autre méthode (de classe).

+1

C'est la bonne façon de procéder si le contrôleur de vue sait quand extraire les informations mises à jour de la classe Phrase. Cependant, la solution de JAL est correcte si le contrôleur de vue a besoin de cette information. Cela dépend de la situation qui est meilleure. –