2

コードはスタンフォード CS193p のものです。確認するために NSLog を追加しました。ラベルが初期化されていないようです。何か案が?

@interface AskerViewController() <UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet UILabel *questionLabel;
@property (weak, nonatomic) NSString *question;
@end


@implementation AskerViewController
@synthesize questionLabel = _questionLabel;
@synthesize question = _question;


 - (void)setQuestion:(NSString *)question
{
    _question = question;
    self.questionLabel.text = question;
    NSLog(@"label is %@", self.questionLabel);
}

@end

NSLog の結果は次のとおりです。

2012-07-31 01:56:45.177 Kitchen Sink[23931:f803] label is (null)
4

1 に答える 1

8

ビュー コントローラーを表示する前に、おそらく prepareForSegue:? で質問文字列プロパティを設定している可能性があります。この時点では、ビューは読み込まれておらず、label プロパティはまだ nil のままです。

別の文字列プロパティを使用することで正しいことを行っています。viewDidLoad でラベルのテキストも設定する必要があるという手順がありません。この時点で、ラベルはストーリーボードからインスタンス化され、使用する準備ができています。

viewDidLoad が呼び出される前にプロパティを設定している場合、ラベルは nil であることが予想されます。また、prepareForSegue からプロパティを設定している場合、ビューはまだ読み込まれていません。ビューコントローラーは、ビューとサブビューを画面に表示する必要があるまでロードしません。これは、セグエが実行されるまで行われません。ご想像のとおり、セグエが実行される前に prepareForSegue が実行されます。

于 2012-07-30T18:50:29.923 に答える