2012-08-22 94 views
0

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

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

当然,这个代码调用了传入的viewController的节目属性的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不会得到更新。此外,如果我再次调用setter,请在viewDidLoad中说,它确实会更改UILabel。这是因为self正在更新?这里发生了什么?

+0

有趣的是,据我所知,你的代码应该像广告一样工作。由于它在viewDidLoad中工作,我不知道这是故事板如何工作的一个怪癖。在prepareForSegue中放置一个断点,然后在你的目标视图控制器中用NSLog实现awakeFromNib,并在那里放置一个断点,然后运行你的程序,看看哪个断点先被命中。如果它是从nib之一醒来,那么问题就在别的地方,但如果它在prepareForSegue中首先出现,那么你的视图还没有从故事板中解除存档,但意味着testLabel在你设置它时是零。 – tapi

+0

也在这种情况下,我不会担心setter风格的事情,这看起来很好。 – tapi

+1

当您的视图层次结构解压缩并分配给您的viewController时,会调用awakeFromNib。如果在awakeFromNib之前调用prepareForSegue,那么问题在于testLabel为零。这可以通过将testlabel代码放在viewDidLoad中来解决。但是,如果您希望使用新的Storyboard热度,那么您可以尝试将其放入performSegueWithIdentifier:sender:在应用程序已将该笔尖取消存档但未提供目标视图控制器之前调用它。 – tapi

回答

0

在其中的一次讲座中,教授解释说,营业网点还没有在prepareForSegue中设置。这意味着testLabel为零,并且您将发送消息给零(这是允许的并且不会导致您的应用程序崩溃)。要解决您的问题,请将textLabel的文本设置为viewDidLoad或viewWillAppear。我相信这是iOS 6中的“固定”,但它不会向后兼容,所以如果你想要支持iOS 5,你必须使用viewDidLoad或viewWillAppear来更新插座(我认为反正更好)。

+0

帮助注意不是它。 –