2010-12-16 3 views
0

Je suis un débutant dans la programmation iPhone. J'essaye d'envoyer un message d'un contrôleur de vue à un autre. L'idée est que viewControllerA prend des informations de l'utilisateur et l'envoie à viewControllerB. viewControllerB est alors censé afficher les informations dans une étiquette.Envoi de messages entre classes Obj-C?

viewControllerA.h

#import <UIKit/UIKit.h> 
@interface viewControllerA : UIViewController 
{ 
int num; 
} 
-(IBAction)do; 
@end 

viewControllerA.m

#import "viewControllerA.h" 
#import "viewControllerB.h" 

@implementation viewControllerA 

- (IBAction)do { 
//initializing int for example 
num = 2; 
viewControllerB *viewB = [[viewControllerB alloc] init]; 
[viewB display:num]; 
[viewB release]; 
//viewA is presented as a ModalViewController, so it dismisses itself to return to the 
//original view, i know it is not efficient but it is not the problem with my code 
[self dismissModalViewControllerAnimated:YES]; 
} 

- (void)dealloc { 
[super dealloc]; 
} 

@end 

viewControllerB.h

#import <UIKit/UIKit.h> 
@interface viewControllerB : UIViewController 
{ 
IBOutlet UILabel *label; 
} 
- (void)display:(int)myNum; 

@end 

viewControllerB.m

#import "viewControllerB.h" 
#import "viewControllerA.h" 

@implementation viewControllerB 

- (void)display:(int)myNum { 
NSLog(@"YES"); 
[label setText:[NSString stringWithFormat:@"%d", myNum]]; 
} 

@end 

OUI est enregistré avec succès, mais le texte de l'étiquette ne change pas. Peut-on envoyer des messages non des variables d'instance d'accès ou quelque chose?

Merci.

+0

Si vos IBOutlets ne sont pas connectés correctement, vous ne verrez rien, peu importe ce que vous faites dans le code, alors assurez-vous d'abord qu'ils sont corrects. – jakev

+0

Cochez les réponses et si votre problème est résolu, acceptez une réponse. – Ishu

Répondre

1

Remplacer tout int avec NSInteger.it va résoudre votre problème.

Edit:

Ok, si vous avez une bonne connexion.

En fait, vous appelez la fonction show de viewA et vous essayez d'écrire le texte sur l'étiquette de viewB à partir d'ici avant de charger cette page pourquoi vous rencontrez un problème.so pour résoudre ce problème, vous devez envoyer la valeur à viewB et écrivez le texte sur l'étiquette dans la méthode viewDidLoad. cela va résoudre ton problème.

+0

Ne résout rien. – jbrennan

+0

@jbrennan, je l'ai fait, ce problème résout avec la solution ci-dessus.Vous avez essayé ceci si pas alors pourquoi -1. – Ishu

+0

@Ishu, je suis d'accord en supposant que ses classes, IBoutlets, etc sont configurés correctement. Ce n'est pas C++, utilisez NSInteger – jakev

1

Il n'y a rien de mal à envoyer des messages de la façon dont vous essayez. L'erreur consiste à utiliser 'int' comme type. Utilisez NSInteger en Objective-C pour soulager de nombreux maux de tête.

+1

Pour les cibles iOS, 'NSInteger' est un typedef de' int'. Ainsi, lorsque le code est prétraité, NSInteger devient simplement int. Cela ne résout donc rien pour les cibles iOS, actuellement. Bien que ce soit une bonne idée, dans le cas où Apple change le type de NSInteger, votre code en bénéficiera automatiquement. Mais dans ce cas, ça ne fait rien. – jbrennan

+0

Ok, point pris. C'était le seul point de faiblesse que je vois dans le code présenté, mais je prends pour acquis que l'o.p. a ses prises sécurisées. – jakev

0

Pouvez-vous clarifier ce que vous faites ici, et comment ces contrôleurs de vue se rapportent à ce qui est à l'écran? Ma compréhension est que viewControllerA est présenté comme une sorte de dialogue modal qui rassemble des informations? Il est présenté par viewControllerB, et quand A se ferme, B définit son étiquette à l'écran pour refléter la valeur renvoyée par A?

Si c'est le cas, vous devez avoir une référence à B dans A, pour plusieurs raisons. -D'abord, vous entrez une instance de B dans la fonction do de A et vous lui demandez d'afficher votre numéro, mais je ne vous vois pas mettre B sur écran n'importe où. -Deuxième, en appelant dismissModalViewControllerAnimated: sur A ne pas rejeter A, il va rejeter le contrôleur de vue modale que A présenté. Donc, pour rejeter A, vous devez dire [self dismissModalViewControllerAnimated:YES]; sur B. C'est mieux accompli en ayant A notifier B qu'il est prêt à être fermé.

1

Il semble que votre label ne pointe à rien (donc quand vous le dites à setText:, ce message est juste envoyé à nil et ainsi rien ne se passe).

Cochez la case Interface Builder pour vous assurer que vous avez défini la sortie pour pointer vers l'étiquette dans votre vue.

+0

@Ishu, êtes-vous l'affiche originale ....? – jakev

+0

@JakeVA, Non mais j'ai fais face à ce problème avant cette fois. – Ishu

+0

premier commentaire pour mon cas que je pensais pour le poster coz problème est en fait de int pas la connexion. Ok, je change cela selon la vraie pensée. – Ishu

1

Y a-t-il plus de code que ce que vous montrez ici? Je ne vois pas comment viewB est affiché - il n'y a pas de [self.view addSubview: viewB.view] ou quoi que ce soit pour indiquer qu'il serait affiché dans une vue.Peut-être que c'est le problème?

Questions connexes