0

参考までに、私はスタンフォード大学のiTunes-UコースでObjective-Cを学ぼうとしています。あるプロパティを別のセッターから更新したかったのです(それらは本質的に接続されています。また、それは悪いスタイルですか?)。更新しようとしているプロパティはUILabelですが、思ったように機能しません。このコードは私のViewControllerの1つにあります:

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

当然、このコードは、着信viewControllerのProgramプロパティのセッターを呼び出します。そのセッターコードは次のとおりです。

-(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

これで、このコードが実行されると、セグエが発生すると、新しいビューのタイトルが変更されます(self.title行が機能します)。ただし、UILabelは更新されません。さらに、viewDidLoadでセッターをもう一度呼び出すと、UILabelが変更されます。これはself更新されたためですか?何が起きてる?

4

1 に答える 1

0

講義の1つで、教授は、prepareForSegueにまだアウトレットが設定されていないと説明しています。これは、testLabelがnilであり、メッセージをnilに送信していることを意味します(これは許可されており、アプリをクラッシュさせません)。問題を解決するには、viewDidLoadまたはviewWillAppearでtextLabelのテキストを設定します。

これはiOS6で「修正済み」だと思いますが、下位互換性はないため、iOS 5を引き続きサポートする場合は、viewDidLoadまたはviewWillAppearを使用してアウトレットを更新する必要があります(これを行う方が良いと思います)とりあえず)。

于 2012-08-22T23:14:36.090 に答える