在类Obj-C之间发送消息?

时间:2010-12-16 06:42:44

标签: iphone objective-c sdk messages

我是iPhone编程的新手。我正在尝试从一个视图控制器向另一个视图控制器发送消息。想法是viewControllerA从用户获取信息并将其发送到viewControllerB。然后viewControllerB应该在标签中显示信息。

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,但标签的文本不会更改。可以发送消息 访问实例变量还是什么?

感谢。

5 个答案:

答案 0 :(得分:1)

将所有int替换为NSInteger.it将解决您的问题。

编辑:

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

实际上发生了什么,你从viewA调用show函数并尝试在此处加载该页面之前在viewB的标签上写入文本dats为什么你遇到问题。为了解决这个问题,你需要向viewB发送值和在viewDidLoad方法中将文本写在标签上。这将解决你的问题。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

检查Interface Builder以确保您已将插座设置为实际指向视图中的标签。

答案 3 :(得分:1)

您的代码是否比您在此处显示的更多?我没有看到viewB是如何显示的 - 没有[self.view addSubview:viewB.view]或任何表明它将在视图中显示的内容。也许这就是问题?

答案 4 :(得分:0)

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

如果是这种情况,您需要在A中引用B,原因有两个。 - 首先,你在A的do函数中输入B的一个实例并告诉它显示你的数字,但我没有看到你把B放在屏幕上的任何地方。 - 其次,在A上调用dismissModalViewControllerAnimated:将不会关闭A,它将关闭A所呈现的模态视图控制器。所以要解雇A,你需要在B上说[self dismissModalViewControllerAnimated:YES];。最好通过让A通知B它已经准备好关闭。