2012-08-22 97 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

幫助注意不是它。 –