0

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

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

自然地,这段代码调用了传入 viewController 的 Program 属性的 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 不会更新。此外,如果我在 viewDidLoad 中再次调用 setter,它确实会更改 UILabel。是因为self更新了吗?这里发生了什么?

4

1 回答 1

0

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

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

于 2012-08-22T23:14:36.090 回答