【问题标题】:Obj-C Sending Messages Between ClassesObj-C 在类之间发送消息
【发布时间】:2011-01-09 19:38:24
【问题描述】:

我是 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 
    [self dismissModalViewControllerAnimated:YES];
}

- (void)dealloc {
    [super dealloc];
}

@end

viewControllerB.h

#import <UIKit/UIKit.h>

@interface viewControllerB : UIViewController
{
    IBOutlet UILabel *label;
}

- (IBAction)openA;
- (void)display:(NSInteger)myNum;

@end

viewControllerB.m

#import "viewControllerB.h"
#import "viewControllerA.h"

@implementation viewControllerB

- (IBAction)openA {
    //presents viewControllerA when a button is pressed
    viewControllerA *viewA = [[viewControllerA alloc] init];
    [self presentModalViewController:viewA animated:YES];
}

- (void)display:(NSInteger)myNum {
    NSLog(@"YES");
    [label setText:[NSString stringWithFormat:@"%d", myNum]];
}

@end

YES 成功记录,但标签的文本没有改变。我已经确定 我在 Interface Builder 中的所有连接都是正确的,实际上还有其他的(IBAction) 在我的程序中更改此标签文本的方法,所有其他方法都可以完美运行...

有什么想法吗,伙计们?您不需要给我一个完整的解决方案,任何信息都会有所帮助。谢谢。

【问题讨论】:

  • 只是为了让您知道 IBAction 方法采用单个 (id)sender 参数。
  • ps。不是你的问题,但也要注意内存泄漏。任何alloc(或copynewretain)都应后跟releaseautorelease
  • @Abizern 他们不是必须的。它们可以匹配developer.apple.com/library/ios/documentation/UIKit/Reference/… 中指定的任何形式
  • @Justin - 我不知道 UIApplication。谢谢!

标签: iphone objective-c sdk messages


【解决方案1】:

viewControllerB *viewB = [[viewControllerB alloc] init];

您正在实例化一个新的viewControllerB。这不是您的 nib 文件中的viewControllerB(我想)。您应该为此制作一个插座并将其连接起来。

否则,可能使用 nib 中的 [... initWithNibName:] 实例化它,而不仅仅是 [... init],然后(无论哪种方式)使用 [self.navigationController pushViewController:viewB animated:YES] 推送实例化的视图控制器,或者通过模态呈现它,就像你似乎已经掌握的那样已经。

作为旁注,可以将 viewcontroller 变量命名为 viewConB,因为视图和视图控制器之间存在明显而重要的区别。此外,类名往往以大写字母开头,变量以小写字母开头,以保持清晰。

【讨论】:

  • 我如何在 viewControllerA 的文件中为 viewControllerB 创建一个出口,因为我在 viewControllerA 中实例化了 B?
  • 如果只使用 alloc/init 实例化视图控制器,整个 nib 文件甚至都不会发挥作用。您必须在 alloc/init 之后手动设置出口变量,例如通过设置viewB.someProperty = self;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多