L'Appel De Méthode À Partir D'Un Autre UIViewController N'A Aucun Effet Visible
J'ai deux classes et souhaitez appeler une méthode d'une classe lorsqu'un bouton est enfoncé. Je déclare dans mon .h fichier de la manière suivante:
-(void) imageChange;
Et j'ai créé la méthode dans mon .m comme ceci:
-(void)imageChange {
UIImage *image = [UIImage imageNamed: img];
[_MyImage setImage:image];
}
Enfin, j'ai essayé d'appeler la méthode d'une autre classe à l'aide de:
- (IBAction)Done:(id)sender {
SecondViewController *theInstance = [[SecondViewController alloc] init];
[theInstance imageChange];
[self dismissViewControllerAnimated:YES completion:nil];
}
Cependant, lorsque je clique sur "done" de mon point de vue contrôleur, le UIImage
ne change pas. Veuillez noter: img
est un NSString
valeur.
Vous êtes à la création d'un nouveau
Quel code dois-je changer?
ce n'est pas un changement tellement comme un ajout: les SecondViewController présenter ce point de vue contrôleur?
Pourriez-vous expliquer? Je suis nouveau à l'Objective-C. Grâce!
Utiliser les délégation!
SecondViewController
et de changer son image. C'est inutile. Vous avez besoin d'une référence à la SecondViewController
et changer son image.Quel code dois-je changer?
ce n'est pas un changement tellement comme un ajout: les SecondViewController présenter ce point de vue contrôleur?
Pourriez-vous expliquer? Je suis nouveau à l'Objective-C. Grâce!
Utiliser les délégation!
OriginalL'auteur C-O-D-E | 2014-06-19
Vous devez vous connecter pour publier un commentaire.
La question est une variation sur une commune: "comment transmettre des valeurs entre les contrôleurs de vue", et votre code représente un effort commun à une solution. Nous allons commencer avec ce que vous avez fait.
Votre application dispose de deux contrôleurs avec des vues sur le point de vue de la pile, et vous souhaitez communiquer quelque chose entre eux. Cette ligne:
crée un nouvelle marque instance de SecondViewController (allocation de moyens allouer de la mémoire pour une nouvelle instance de cette classe). Cette ligne:
communique quelque chose, dans votre cas, il ressemble réglage d'une image de la vue de l'image. Alors cette ligne:
implicitement détruit cette nouvelle instance, comme il n'est jamais mentionné à nouveau. Ainsi, votre code réussit à communiquer avec un SecondViewController, mais avec le mauvais exemple, une instance qui ne vit que quelques millisecondes.
Bon, de quoi faire à ce sujet? Ce que @rmaddy était en train de dire, c'est d'aller trouver l'instance existante de SecondViewController, et de communiquer avec qui. Comment obtenir ahold de l'instance existante dépend de la façon dont nous sommes arrivés ici. Le dismissViewControllerAnimated dans votre code me fait penser que ce courant vc a été présenté par une instance de SecondVC. Si oui,
points à ce que vous avez besoin. Si nous étions dans un
UINavigationController
, vous pouvez creuser par le biais deviewControllers
pile, probablement ici:Mais, tandis que tout ce qui pourrait être la ligne la plus droite de A à B, il n'est pas très bonne conception, car elle rend ce courant-vue-contrôleur dépendante dans un fragile manière sur la façon dont il a obtenu présenté.
Donc @CrimsonChris fait une bonne suggestion de considérer la délégation. C'est que la plupart des gens aller à motif pour un vc qui a besoin de communiquer avec un autre. Il ya beaucoup de web et de ressources sur la façon de le faire, donc je ne vais pas répéter ici. Découvrez ce, par exemple, ou google "iOS délégation".
Il existe d'autres moyens, comme
NSNotificationCenter
de diffuser à tout le monde qui est intéressé tout ce que vous voulez communiquer, ou KVO qui permet à la SecondVC observer un changement dans votre modèle et de réagir, peu importe comment ou pourquoi ce changement a été fait.Le concept clé pour ces deux derniers, c'est que votre application a besoin d'avoir un modèle, un ensemble d'objets qui décrit l'état d'application. Le point de vue des contrôleurs ne sont pas le modèle -- en fait, ils sont exactement pas le modèle. Leur travail consiste à apprendre au sujet des changements de modèle et de modifier les points de vue en conséquence.
Pour votre cas, le code que vous avez posté ne devriez pas être en train d'essayer d'obtenir une image à l'autre-vue-contrôleur, il devrait être de l'enregistrement dans le modèle quelle que soit l'action de l'utilisateur qui s'est passé, ce qui déclenche l'licenciement. Lorsque ce courant vc rejette lui-même, le SecondViewController (en supposant qu'il ne l'), obtenir un viewWillAppear. Cette méthode pourrait être un bon endroit pour vérifier le modèle de l'état qui a été mis sur l'action de l'utilisateur. Puis SecondViewController peut appeler imageChange sur lui-même.
Espère que c'était assez clair. Bonne chance.
Merci beaucoup, vous venez de faire ma journée! C'est mon 14ème anniversaire merci pour ce cadeau spécial qui m'a aidé à corriger le bug qui a été me tracasse depuis si longtemps!
OriginalL'auteur danh