2016-03-23 2 views
0

Donc c'est un peu une question étrange et je ne suis même pas sûr de ce que l'information à fournir. J'ai un contrôleur de vue personnalisé et UIview qui est intégré dans le contrôleur de vue. J'ai créé une sortie pour l'UIView dans le contrôleur de vue qui est connecté. Tout a l'air bien, mais quand je lance mon programme, viewcontroller et uiview se connectent, mais le uiview ne devient pas une propriété du contrôleur de vue. (Comme si elle était initiée quelque part ailleurs dans le code) Cela crée une exception car quand je vais définir le délégué, la vue est considérée comme nulle. Voici une photo de ce que je suis à la recherche:Pourquoi swift uiview ne serait-il pas connecté au contrôleur de vue?

enter image description here

donc basé sur la façon dont je mis en place la sortie, l'objet doit être vue lié au contrôleur de vue via la propriété calendarview.

Voici ce qui ressemble à l'exception comme la demande:

enter image description here

Toutes les idées sur la façon dont je peux poursuivre debug cette question serait grandement apprécié.

+0

Cela m'est arrivé plusieurs fois. Faire une construction propre et supprimer le répertoire de données dérivé aide généralement. – Macondo2Seattle

+0

exception ajoutée. – Chris

+0

À quoi ressemble le code autour de l'endroit où la fonction de plantage est appelée? Plus précisément, comment obtient-il une référence à ViewController? –

Répondre

0

Il est probable que la sortie CalendarView est connecté et initialisé se avant le dayLabel. Au cours de son initialisation, (je déduis), il appelle son délégué tout de suite, et rencontre le non initialisé dayLabel. Rappelez-vous, l'initialisation est une séquence qui se produit au fil du temps; les sorties ne s'initialisent pas ensemble instantanément.

L'élément clé à réaliser est que les prises ne sont garanties que d'être entièrement connectées au moment où le viewDidLoad() est appelé, pas avant. Mettez donc une copie de débogage dans cette méthode et la méthode causant des erreurs et voyez ce qui se passe réellement en premier. Je sais où miser mon argent.

Mettez également didSet { print("Hey I got initialized!") } des observateurs de propriété sur votre @IBOutlets pour surveiller également la synchronisation précise. Cela force le code de démarrage à vous dire ce qu'il fait quand.

Je ne connais pas votre flux d'interface utilisateur complet; vous devez coller l'intégralité de la base de code quelque part. Mais il est peut-être raison de le faire:

if let dayLbl = dayLabel { 
    dayLbl.text = date.stringWithDateOnly() 
} 

au lieu de supposer qu'il est prêt.