在类 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 目标,NSInteger
是 int
的 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实现线程间发送消息 (主线程 与 子线程之间)(子线程 与 子线程之间)