2010-12-16 102 views
0

我是iPhone编程的新手。我试图从一个视图控制器发送消息到另一个。这个想法是,viewControllerA从用户获取信息并将其发送到viewControllerB。 viewControllerB然后应该显示在标签中的信息。在类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已成功记录,但标签的文本不会更改。可以发送消息不是 访问实例变量什么的?

谢谢。

+0

如果您没有正确连接IBOutlet,则无论您在代码中做什么,都不会看到任何内容,因此请确保这些内容正确无误。 – jakev 2010-12-16 07:18:41

+0

检查答案,如果你的问题已经解决,然后接受一个答案。 – Ishu 2010-12-16 08:10:47

回答

1

用NSInteger替换所有int将解决您的问题。

编辑:

好的,如果你有正确的连接。

实际上会发生什么情况,您从viewA调用show函数并尝试从这里将文本写入viewB的标签之前,然后加载该页面dats为什么您面临problem.so要解决此问题,则需要将值发送到viewB并使用viewDidLoad方法将文本写在标签上。这将解决您的问题。

+0

什么都不解决。 – jbrennan 2010-12-16 06:59:45

+0

@ jbrennan,我已经做到了这一点,这个问题解决了上述的解决方案。你试过这个如果不是那么为什么-1。 – Ishu 2010-12-16 07:02:45

+0

@Ishu,我同意假设他的班级,IBoutlets等设置正确。这不是C++,使用NSInteger – jakev 2010-12-16 07:10:51

1

以您尝试的方式发送消息没有任何问题。错误在于使用'int'作为类型。在Objective-C中使用NSInteger来减轻许多头痛。

+1

对于iOS目标,'NSInteger'是一个int类型定义。所以当代码被预处理时,NSInteger就变成了int。所以目前它不能解决iOS目标的任何问题。虽然这是一个好主意,但如果Apple改变了NSInteger的类型,你的代码将自动获得好处。但在这种情况下,它什么都不做。 – jbrennan 2010-12-16 07:19:26

+0

好的,点了。这是我在代码中看到的唯一弱点,但我认为理所当然的是,有他的网点安全。 – jakev 2010-12-16 07:28:58

0

你能澄清你在这里做什么,以及这些视图控制器如何与屏幕上显示的内容相关联吗?我的理解是,viewControllerA是作为某种收集信息的模态对话框呈现的?它由viewControllerB提供,当A关闭时,B在屏幕上设置其标签以反映从A返回的值。

如果是这种情况,由于某些原因,您需要在A中引用B。首先,您在A的do函数中初始化B的一个实例并告诉它显示您的号码,但我没有看到您将B放置在任何地方。 - 第二,在A上调用dismissModalViewControllerAnimated:不会解除A,它将关闭A呈现的模式视图控制器。所以要解雇A,你需要在B上说[self dismissModalViewControllerAnimated:YES];。最好通过让A通知B它已准备好关闭。

1

看起来好像你的label没有指向任何东西(所以当你告诉它setText:时,该消息只是发送到nil,因此没有任何反应)。

检查界面生成器以确保您已将出口设置为实际指向视图中的标签。

+0

@Ishu,你是原始的海报....? – jakev 2010-12-16 07:13:22

+0

@JakeVA,不,但我在这段时间之前面对这个问题。 – Ishu 2010-12-16 07:15:01

+0

我的情况的第一个评论,我认为这个海报因为问题实际上是int而不是连接。好的,我根据真正的想法改变它。 – Ishu 2010-12-16 07:17:05

1

有没有比你在这里显示的更多的代码?我没有看到viewB是如何显示的 - 没有[self.view addSubview:viewB.view]或任何表示它将显示在视图中的东西。也许这就是问题所在?