无法访问另一个类的公共变量

时间:2012-11-20 19:04:09

标签: objective-c

我知道这个问题经常被问到,我已经阅读了很多,但我仍然无法让它发挥作用。假设我有两个类,FirstClass和SecondClass。 FirstClass有一个标签,SecondClass想要获得该标签的文本。这就是我所做的:

//FirstClass
@interface FirstClass : UIViewController
{
@public
    UILabel *theLabel;
}
@property (strong, nonatomic) UILabel *theLabel;

@implementation FirstClass
@synthesize theLabel;


//SecondClass
#import "MainGameDisplay.h"
@interface SecondClass : UIViewController
{
    MainGameDisplay *mainGame;
}
@property (strong, nonatomic) UILabel *theSecondLabel;

@implementation SecondClass

-(void) thisMethodIsCalled {
    mainGame = [[FirstClass alloc] init];

    self.theSecondLabel.text = mainGame.theLabel.text;
    NSLog(@"%@",mainGame.theLabel.text); //Output is '(Null)'
}

theLabel.Text不是nil,因为它每秒都在更改,并且还在加载SecondClass视图时在后台运行的另一个控制器上显示标签。如果我完全错了,有人可以指点我的写作方向,或者给我一些关于如何做到这一点的例子。谢谢。


编辑:

@Implementation FirstClass
@synthesize theLabel;

- (void)viewDidLoad {
    [self superview];
    [self startTickCount];
}

-(void) startTickCount {
            timer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector(timeChanger) userInfo:nil repeats:YES];
}

-(void) timeChanger {
        theDay++;
        NSLog(@"%@",self.theLabel.text);
        if (theDay <= 9)
            self.theLabel.text = [NSString stringWithFormat: @"0%i", theDay];
        else
            self.theLabel.text = [NSString stringWithFormat: @"%i", theDay];
        if (theDay > 27)
            [self monthChanger];
}

这就是它。 NSLog按预期输出当天。

4 个答案:

答案 0 :(得分:1)

如果你没有遗漏大量的代码,

-(void) thisMethodIsCalled {
mainGame = [[MainGameDisplay alloc] init];

self.theSecondLabel.text = mainGame.theLabel.text;
NSLog(@"%@",mainGame.theLabel.text); //Output is '(Null)'
}

不起作用..没有人可以在alloc init和.text变量之间修改mainGame ....

[@所有我知道这不是一个答案,但评论的格式很糟糕。我会根据需要编辑或删除它]

答案 1 :(得分:1)

我认为MainGameDisplay是你的FirstClass。然后,为了更新SecondClass对象中的SecondLabel.text,您需要传递FirstClass的对象,而不是在方法调用中实例化它。

我想你需要做这样的事情(这是一个非常简单的例子)

  1. 向SecondClass添加属性 @property(非原子,强)FirstClass * firstClass;
  2. 之后:

    1)创建FirstClass的实例,让它具有名称firstClass。

    2)创建SecondClass的实例。 SecondClass * secondClass = [[SecondClass alloc] init];

    3)将Second类的属性设置为FirstClass的实例

    secondClass.firstClass = firstClass;
    

    4)现在您可以参考FirstClass的实际对象并可以访问其属性。

    -(void) thisMethodIsCalled {
    
        self.theSecondLabel.text = self.firstClasss.theLabel.text;
        NSLog(@"%@",mainGame.theLabel.text); 
    }
    

    我希望这会有所帮助。

答案 2 :(得分:0)

方法名称是文本,而不是文本。这种情况很重要,使用较低T的文本会导致错误。

答案 3 :(得分:0)

如果这是您的代码,那么您有两个问题。首先,Text不必要地大写。其次,TheLabel不必要地大写。

编辑代码:

-(void) thisMethodIsCalled {
    mainGame = [[MainGameDisplay alloc] init];

    // 'text' shouldn't be capitalized
    // 'theLabel' shouldn't be capitalized
    self.theSecondLabel.text = mainGame.theLabel.text;
    NSLog(@"%@",mainGame.theLabel.text);
}