2012-07-30 95 views
2

代码来自Stanford CS193p。我添加了一个NSLog来检查它。标签似乎没有被初始化。任何想法?为什么UILabel没有初始化?

@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) 
+0

_what_的获取和设置?当他们被叫时他们会被打电话,你需要提供更多信息或者这个问题不能得到回答。 – jrturton 2012-07-30 15:23:27

+0

你说得对。我修改了这篇文章,并提出了使问题具体的代码。 – Philip007 2012-07-30 18:11:26

+0

您的UILabel已连接/链接到questionLabel吗? – 2012-07-30 18:12:35

回答

7

你可能会设置您在prepareForSegue显示视图控制器,想必之前的问题字符串属性:?此时,视图尚未加载,标签属性仍然为零。

你在做right thing by having a separate string property,你只是想念你还必须在viewDidLoad中设置标签文本的步骤 - 此时你的标签已经从storyboard中实例化并且可以使用。

如果您在调用viewDidLoad之前设置属性,则预期标签为nil。如果你正在从prepareForSegue设置属性,视图将不会被加载。视图控制器不会加载它的视图和子视图,直到它需要在屏幕上显示它们,并且直到执行segue才会发生这种情况 - 正如你所猜测的,prepareForSegue是在执行segue之前完成的。

+0

如果故事板中有一个标签,则不要分配/初始化标签。这就是你的标签来自哪里。如果您在调用viewDidLoad之前设置属性,则预期标签为nil。如果你正在从prepareForSegue设置属性,视图将不会被加载。视图控制器不会加载它的视图和子视图,直到它需要在屏幕上显示它们,并且直到执行segue才会发生这种情况 - 正如你所猜测的,prepareForSegue是在执行segue之前完成的。这已经变成了一个长长的评论,我要把它添加到我的答案... – jrturton 2012-07-30 20:26:43

+0

我明白了。我在prepareForSegue中放置了一些类似于segue.destinationViewController.question的东西,它调用了setQuestion,它反过来试图访问questionLabel,它在segueing期间还没有加载成目标视图控制器的视图层次结构中的子视图。这就是为什么NSLog返回null。没问题。 – Philip007 2012-07-30 20:39:27

+0

没错。你仍然应该在setQuestion中保留这些代码,因为当视图仍然被加载的时候你可能会再次设置这个问题,你只需要在viewDidLoad中多加一些。 – jrturton 2012-07-30 20:42:10

相关问题