2013-07-20 4 views
0

J'essaie de mettre à jour le contenu de l'interface d'un ContainerView sur iOS (UIViewController intégré dans un UIView) à partir du UIViewController dans lequel il est affiché. Cependant, ContainerView ne mettra pas à jour son contenu.Problèmes de mise à jour des objets d'interface iOS ContainerView

ContainerView et ViewController sont associés à différentes classes. Je peux transmettre des données entre les deux contrôleurs de vue en utilisant quelques méthodes comme celles-ci:

- (void)displayStringInContainer:(NSString *)string 

Le string est transmis avec succès à la ContainerView du ViewController, mais lorsque je tente d'afficher cette chaîne dans un élément d'interface - rien arrive (même si le code est appelé se):

self.buttonName.titleLabel.text = string; 

J'ai même essayé d'appeler setNeedsDisplay sur le bouton, mais rien ne se passe. Notez que cela se produit avec tous les éléments d'interface.

Voilà comment j'appelle la méthode sur la ContainerView de mon ViewController:

ContainerViewController *cvc = [[ContainerViewController alloc] init]; 
[cvc displayStringInContainer:@"Text"]; 

Je l'ai fait un peu de recherche, mais ai rien trouvé (également essayé de regarder sur l'Apple Dev site , mais ça fait trois jours que ça tombe: P). Est-ce que quelqu'un sait comment mettre à jour le contenu d'un ContainerViewController d'un autre ViewController? Pourquoi cela ne fonctionne-t-il pas? Je me suis gratté la tête pendant un moment maintenant.

+0

Comment avez-vous vu le conteneur dans votre vue 'UIViewController's'? – Peres

+0

@JackyBoy ContainerView est intégré (via le séquencement de storyboard) dans un 'UIView' à l'intérieur de mon' UIViewController'. J'ai juste fait glisser la Vue Conteneur de la bibliothèque d'objets sur mon storyboard et l'ai connectée. –

+0

Je n'utilise pas Storyboards, pour plusieurs raisons. Vous venez de m'en donner un autre. En utilisant le code, il vous faudrait 30 secondes pour le faire. Désolé, je ne peux pas vous aider. – Peres

Répondre

1

Alloc init'ing cvc n'est pas la bonne façon d'obtenir votre référence - c'est une nouvelle instance, pas la même instance que celle incluse dans votre vue. Vous pouvez accéder à cette instance dans le code du contrôleur parent avec self.childViewControllers [0] (en supposant que vous ayez une seule vue de conteneur). Vous pouvez également obtenir la référence en implémentant prepareForSegue et en utilisant segue.destinationController (qui sera votre contrôleur intégré). Ce que vous semblez manquer à votre compréhension, c'est que le contrôleur que vous obtenez lorsque vous utilisez une vue de conteneur dans le storyboard est un contrôleur de vue enfant. C'est la même chose que si vous aviez appelé [self addChildViewController: quelquechose] dans le code, puis ajouté la vue de l'enfant sous forme de sous-vue de votre vue.

+0

Merci pour la bonne explication. Je ne connaissais pas les contrôleurs Child View auparavant. En plus de fournir 'l'index' de l'enfant VC (dans ce cas 0) dans le tableau CVC, y a-t-il un autre moyen d'y accéder? Peut-être utiliser l'ID de storyboard? –

+1

@RazorSharp, comme je l'ai dit, vous pouvez également utiliser segue.destinationViewController depuis prepareForSegue, mais il n'y a aucun moyen d'y accéder par un identifiant. Malheureusement, il n'y a pas de méthode viewControllerWithIdentifier: type pour accéder simplement à un contrôleur. Vous pouvez seulement utiliser son identifiant pour en instancier un nouveau, ce que vous ne voulez pas faire. – rdelmar

Questions connexes