Почему UILabel не инициализируется?

Код из Стэнфорда 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)

1 ответ

Решение

Вы, вероятно, устанавливаете свойство строки вопроса перед отображением контроллера представления, предположительно в prepareForSegue:? На данный момент представление не загружено, и свойство label все равно будет равно nil.

Вы делаете правильно, имея отдельное строковое свойство, вы просто пропускаете шаг, на котором вы также должны установить текст метки в viewDidLoad - в этот момент ваш ярлык был создан из раскадровки и готов к использованию.

Если вы устанавливаете свойства до вызова viewDidLoad, ожидается, что метка будет nil. И если вы устанавливаете свойства из prepareForSegue, представление еще не будет загружено. Контроллер представления не будет загружать свой вид и подпредставления до тех пор, пока ему не понадобится отобразить их на экране, а этого не произойдет, пока не будет выполнена передача - и, как вы можете догадаться, prepareForSegue выполняется до того, как будет выполнена передача.

Другие вопросы по тегам