2010-12-16 9 views
0

Ich bin ein Neuling in iPhone Programmierung. Ich versuche, eine Nachricht von einem Ansichtscontroller an einen anderen zu senden. Die Idee ist, dass viewControllerA Informationen vom Benutzer übernimmt und an viewControllerB sendet. viewControllerB soll dann die Information in einem Label anzeigen.Senden von Nachrichten zwischen Klassen 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 

YES wird erfolgreich protokolliert, aber der Text des Labels ändert sich nicht. Kann Nachrichten gesendet werden nicht Zugriff Instanz Variablen oder etwas?

Danke.

+0

Wenn Sie Ihre IBOutlets nicht korrekt verbunden haben, werden Sie nichts sehen, egal was Sie im Code tun, also stellen Sie sicher, dass diese korrekt sind. – jakev

+0

überprüfen Sie die Antworten und wenn Ihr Problem gelöst hat, dann akzeptieren Sie eine Antwort. – Ishu

Antwort

1

Ersetzen Sie alle int mit NSInteger.it wird Ihr Problem zu lösen.

Edit:

Ok, wenn Sie die richtige Verbindung.

eigentlich, was passiert, rufen Sie die Show-Funktion von viewA und versuchen, den Text über das Label von viewB von hier vor dem Laden dieser Seite dats warum Sie Problem.so Problem Lösung für dieses Problem müssen Sie Wert an viewB senden zu schreiben und schreibe den Text über das Label in der viewDidLoad-Methode. das wird dein Problem lösen.

+0

Löst nichts. – jbrennan

+0

@jbrennan, ich habe dies getan, löst dieses Problem mit der obigen Lösung.Sie versuchten dies, wenn nicht dann, warum -1. – Ishu

+0

@Ishu, ich stimme zu, vorausgesetzt, seine Klassen, IBoutlets usw. sind korrekt eingerichtet. Dies ist nicht C++, benutze NSInteger – jakev

1

Es ist nichts falsch daran, Nachrichten so zu senden, wie Sie es versuchen. Der Fehler besteht darin, 'int' als Typ zu verwenden. Verwenden Sie NSInteger in Objective-C, um zahlreiche Kopfschmerzen zu lindern.

+1

Für iOS-Ziele ist 'NSInteger' ein Typdef von' int'. Wenn der Code vorverarbeitet wird, wird NSInteger also nur int. So löst es momentan nichts für iOS-Ziele. Obwohl es eine gute Idee ist, wenn Apple den Typ von NSInteger ändert, erhält Ihr Code automatisch die Vorteile. Aber in diesem Fall tut es nichts. – jbrennan

+0

Ok, Punkt genommen. Es war der einzige Punkt der Schwäche, den ich in dem vorgelegten Code sehe, aber ich nehme an, dass das o.p. hat seine Steckdosen gesichert. – jakev

0

Können Sie erläutern, was Sie hier tun und wie sich diese View-Controller auf das, was auf dem Bildschirm angezeigt wird, beziehen? Ich verstehe, dass viewControllerA als eine Art modaler Dialog präsentiert wird, der Informationen sammelt? Es wird von viewControllerB dargestellt, und wenn A schließt, setzt B seine Beschriftung auf dem Bildschirm, um den von A zurückgegebenen Wert wiederzugeben.

Wenn dies der Fall ist, müssen Sie aus mehreren Gründen einen Verweis auf B in A haben. - Zuerst steckst du eine Instanz von B in die do Funktion von A und sagst sie, dass du deine Nummer anzeigen sollst, aber ich sehe nicht, dass du B irgendwo auf den Bildschirm legst. - Zweitens ruft dismissModalViewControllerAnimated: auf A A nicht ab, es wird den Modalansicht-Controller, den A präsentierte, ablehnen. Um also A zu verwerfen, müssen Sie auf B sagen. Das wird am besten erreicht, indem Sie A benachrichtigen, dass B bereit ist, geschlossen zu werden.

1

Es scheint, als ob Ihre label nicht auf etwas zeigt (also, wenn Sie es zu setText: sagen, wird diese Nachricht nur an nil gesendet und somit passiert nichts).

Überprüfen Sie den Interface Builder, um sicherzustellen, dass Sie die Steckdose so eingestellt haben, dass sie tatsächlich auf das Etikett in Ihrer Ansicht zeigt.

+0

@Ishu, bist du das Originalplakat ....? – jakev

+0

@JakeVA, Nein, aber ich habe dieses Problem vor dieser Zeit. – Ishu

+0

erster Kommentar für meinen Fall, die ich für das Poster Coz Problem dachte, ist in der Tat der Int nicht die Verbindung. Ok, ich ändere das nach echtem Denken. – Ishu

1

Gibt es mehr zu Ihrem Code als das, was Sie hier zeigen? Ich sehe nicht, wie viewB angezeigt wird - es gibt keine [self.view addSubview: viewB.view] oder irgendetwas, das anzeigt, dass es in einer Ansicht angezeigt wird.Vielleicht ist das das Problem?