从segue Objective-C中设置另一个属性的setter的属性

时间:2012-08-22 22:22:04

标签: objective-c ios cocoa-touch setter

作为参考,我正在尝试通过斯坦福iTunes-U课程学习Objective-C。我想从另一个属性的setter中更新一个属性(它们本身就是连接的。另外,那是不好的风格吗?)。我想要更新的属性是UILabel,但它不像我想的那样工作。 此代码位于我的一个视图控制器中:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    [segue.destinationViewController setProgram:self.brain.program];
}

当然,这段代码调用了传入viewController的Program属性的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

现在,当运行此代码时,当segue发生时,新视图的标题已更改(self.title行有效)。但是,UILabel不会更新。此外,如果我再次在setDidLoad中调用setter,它确实会更改UILabel。这是因为self正在更新吗?这是怎么回事?

1 个答案:

答案 0 :(得分:0)

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

我相信这在iOS 6中是“固定的”,但它不会向后兼容,所以如果你还想支持iOS 5,你必须使用viewDidLoad或viewWillAppear更新插座(我认为是最好还是做。)