从另一个属性设置属性';来自segue Objective-C的s二传手

从另一个属性设置属性';来自segue Objective-C的s二传手,objective-c,ios,cocoa-touch,setter,Objective C,Ios,Cocoa Touch,Setter,作为参考,我试图通过斯坦福iTunes-U课程学习Objective-C。我想从另一个属性的setter中更新一个属性(它们是内在连接的。而且,这是一种糟糕的样式吗?)。我试图更新的属性是UILabel,但它不像我想象的那样工作。 此代码位于“我的视图”控制器之一中: -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { [segue.destinationViewController setProgr

作为参考,我试图通过斯坦福iTunes-U课程学习Objective-C。我想从另一个属性的setter中更新一个属性(它们是内在连接的。而且,这是一种糟糕的样式吗?)。我试图更新的属性是UILabel,但它不像我想象的那样工作。 此代码位于“我的视图”控制器之一中:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    [segue.destinationViewController setProgram:self.brain.program];
}
自然地,这段代码为传入的viewController的程序属性调用setter。下面是setter代码:

-(void)setProgram:(id)program {
    _program = program;
    self.title = [CalculatorBrain descriptionOfProgram:program];
    [self.graphview setNeedsDisplay];
    self.testLabel.text = @"Trying to update your text!";
}
和头文件:

#import <UIKit/UIKit.h>

@interface GraphViewController : UIViewController
@property (nonatomic, strong) id program;

@property (weak, nonatomic) IBOutlet UILabel *testLabel;

@end
#导入
@界面图ViewController:UIViewController
@属性(非原子,强)id程序;
@属性(弱、非原子)IBUILabel*testLabel;
@结束

现在,当运行此代码时,正如segue所发生的那样,新视图的标题确实发生了更改(self.title行起作用)。但是,UILabel不会得到更新。此外,如果我再次调用setter,比如说在viewDidLoad中,它确实会更改UILabel。这是因为
self
正在更新吗?这是怎么回事?

在其中一次讲座中,教授解释说,在准备课中还没有设置出口。这意味着testLabel为nil,您正在向nil发送消息(这是允许的,不会使您的应用程序崩溃)。要解决问题,请在viewDidLoad或ViewWillDisplay中设置textLabel的文本


我相信这在iOS 6中是“固定”的,但它不会向后兼容,因此如果您仍想支持iOS 5,则必须使用viewDidLoad或ViewWillAspect来更新outlets(我认为这是最好的方式)。

有趣的是,据我所知,您的代码应该按照广告的方式工作。由于它在viewDidLoad中工作,我想知道这是否是故事板工作方式的一个怪癖。在prepareForSegue中放置断点,然后在目标视图控制器中使用NSLog实现awakeFromNib并在那里放置断点,然后运行程序并查看首先命中的断点。如果是从nib中唤醒,那么问题就出在其他地方,但是如果它首先进入prepareForSegue,那么您的视图还没有从故事板中脱离出来,这意味着设置时testLabel为零。同样,在这种情况下,我不会担心setter样式的问题,这看起来不错。当视图层次结构被解压缩并分配给viewController时,将调用awakeFromNib。如果在awakeFromNib之前调用prepareForSegue,那么问题是testLabel为nil。这可以通过将testlabel代码放入viewDidLoad中来修复。但是,如果您希望使用新的故事板热度,那么您可以尝试将其放入performsguewithidentifier:sender:中,该函数应在nib未归档后但在显示目标视图控制器之前调用。请注意,不是吗。