我有一个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
}
答案 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