尝试从另一个类访问时,类中的对象为nil

时间:2014-03-31 01:59:15

标签: ios objective-c class properties

我有一个View Controller类,它包含一个button属性,我需要从另一个类(Table View Controller)更改它的enabled声明。我也在调用VC类中的方法。我可以很好地调用该方法,但是当我尝试访问button属性时,它是零。实际上它的所有属性都是零。我必须有一些不正确的东西。

//ViewController.h
@property (strong, nonatomic) IBOutlet UIButton *aButton;
- (IBAction)myButtonTapped;

//ViewController.m
//did not override setter or getter for aButton
- (IBAction)myButtonTapped {
     //code here
}

//Table VC.m
@property (strong, nonatomic) ViewController *myVC;

- (ViewController *)myVC {
    if (!_myVC) _myVC = [[ViewController alloc] init];
    return _myVC;
}

- (void)userEnteredText:(NSNotification *)notification {
     [self.myVC myButtonTapped]; //runs method without issue
     self.myVC.aButton.enabled = YES; //does not occur since aButton is nil - myVC is not nil
}

1 个答案:

答案 0 :(得分:1)

您需要研究@Hot Licks提供的信息,以了解如何在对象之间保留引用,但我可以告诉您,问题的一部分是您的getter方法 -

- (ViewController *)myVC {
    if (!_myVC) _myVC = [[ViewController alloc] init];   //  <-- This is a problem
    return _myVC;
}

如果您的_myVC变量为nil,那么您的getter方法会分配 new ViewController - 因此您将无法获得对现有viewController的引用。然后,当您为新init调用普通viewController方法时,其属性将不会被初始化 - 因此您的按钮将为零。

您不需要为此类简单属性编写任何代码 - 只需为您创建的默认代码即可。您需要做的是从当前myVC实例设置viewController属性。所以在viewController的某个地方你会有

tableVC.myVC=self; 

你需要在你引用tableVC的地方这样做 - 所以如果你使用的是故事板和segues,或者你在哪里,或者如果你不是,那么这可以在prepareForSegue