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

Posted

技术标签:

【中文标题】在类 Obj-C 之间发送消息?【英文标题】:Sending Messages Between Classes Obj-C? 【发布时间】:2010-12-16 06:42:43 【问题描述】:

我是 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 成功记录,但标签的文本没有改变。不能发消息 访问实例变量什么的?

谢谢。

【问题讨论】:

如果您的 IBOutlets 连接不正确,那么无论您在代码中做什么,都将看不到任何内容,因此请先确保这些内容正确。 检查答案,如果您的问题已解决,则接受一个答案。 【参考方案1】:

按照您尝试的方式发送消息没有任何问题。错误在于使用“int”作为类型。在 Objective-C 中使用 NSInteger 来缓解许多令人头疼的问题。

【讨论】:

对于 ios 目标,NSIntegerint 的 typedef。所以当代码被预处理时,NSInteger 就变成了 int。因此,目前它不能解决 iOS 目标的任何问题。虽然这是一个好主意,但如果 Apple 更改 NSInteger 的类型,您的代码将自动获得好处。但在这种情况下,它什么也不做。 好的,重点。这是我在提供的代码中看到的唯一弱点,但我理所当然地认为 o.p.他的网点得到保护。【参考方案2】:

您的label 似乎没有指向任何东西(所以当您告诉setText: 时,该消息只是被发送到nil,因此没有任何反应)。

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

【讨论】:

@JakeVA ,不,但在此之前我遇到过这个问题。 对我的案例的第一条评论,我认为海报问题实际上是 int 而不是连接。好的,我根据实际想法改变它。 我已经完成了我认为的所有连接设置,那么您现在对我的情况有什么建议(不假设原始帖子)。 你是对的,实际上问题是别的。但再次连接不是问题。【参考方案3】:

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

【讨论】:

【参考方案4】:

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

编辑:

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

实际上会发生什么,您从 viewA 调用 show 函数并尝试从此处将文本写入 viewB 的标签上,然后再加载该页面,说明您遇到问题的原因。因此,要解决此问题,您需要将值发送到 viewB 和在 viewDidLoad 方法中将文本写在标签上。这将解决您的问题。

【讨论】:

@jbrennan,我已经做到了,这个问题用上面的解决方案解决了。如果没有,你试过这个,那么为什么-1。 @Ishu,我同意假设他的课程、IBoutlets 等设置正确。这不是 c++,使用 NSInteger 好的,您可以通过在此条件下制作示例代码来检查。 @Ishu Gupta — 为什么将普通文本格式化为代码?没有意义,而且看起来很丑。 @vikingosegundo,好的,谢谢。我改变了这个。【参考方案5】:

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

如果是这种情况,出于几个原因,您需要在 A 中引用 B。 -首先,您在 A 的 do 函数中初始化 B 的实例并告诉它显示您的号码,但我没有看到您将 B 放在屏幕上的任何地方。 -其次,在 A 上调用 dismissModalViewControllerAnimated: 不会关闭 A,它会关闭 A 呈现的模态视图控制器。因此,要解雇 A,您需要在 B 上说 [self dismissModalViewControllerAnimated:YES];。这最好通过让 A 通知 B 它已准备好关闭来完成。

【讨论】:

以上是关于在类 Obj-C 之间发送消息?的主要内容,如果未能解决你的问题,请参考以下文章

向作为数组成员的对象发送消息

Android 使用handler实现线程间发送消息 (主线程 与 子线程之间)(子线程 与 子线程之间)

如何使用 python 信号在独立进程之间发送消息?

在两个应用程序之间发送消息

如何在 chrome 扩展本机消息传递和 c# 应用程序之间发送/接收消息

如何使用 websocket 在具有相同令牌的用户之间发送消息?