我有一个包含按钮属性的 View Controller 类,我需要从不同的类( TableView Controller )更改其启用状态。我还调用了该 VC 类中的一个方法。我可以很好地调用该方法,但是当我尝试访问按钮属性时,它是零。实际上它的所有属性都是零。我一定是设置不太对。
//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
}
最佳答案
您需要研究@Hot Licks 提供的信息,以了解如何在对象之间保持引用,但我可以告诉您,部分问题在于您的 getter 方法 -
- (ViewController *)myVC {
if (!_myVC) _myVC = [[ViewController alloc] init]; // <-- This is a problem
return _myVC;
}
如果您的 _myVC 变量为零,那么您的 getter 方法会分配一个新 ViewController
- 因此您不会获得对现有 viewController
的引用>。然后,当您为新的 viewController
调用普通的 init
方法时,它的任何属性都不会被初始化 - 因此您的按钮将得到 nil。
您不需要为这样的简单属性编写任何代码 - 为您创建的默认代码就足够了。您需要做的是从当前的 viewController
实例设置 myVC
属性。因此,在您的 viewController
中的某个地方,您将拥有
tableVC.myVC=self;
您需要在引用 tableVC 的地方执行此操作 - 因此,如果您使用 Storyboard 和 Segue,或者在任何呈现或推送 table VC 的地方,这可能位于 prepareForSegue
中(如果您不是
关于ios - 尝试从另一个类访问时类中的对象为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22752504/