【问题标题】:Why UILabel is not initialized?为什么 UILabel 没有初始化?
【发布时间】:2012-07-28 06:27:03
【问题描述】:

代码来自斯坦福 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)

【问题讨论】:

  • 什么的getter和setter?他们在接到电话时会接到电话,您需要提供更多信息,否则无法回答此问题。
  • 你是对的。我修改了帖子并添加了代码以使问题具体化。
  • 您的 UILabel 是否已连接/链接到 questionLabel?
  • setQuestion: 不初始化标签。它只设置文本。标签是否已初始化?在 Interface Builder 中是否连接了插座?
  • 肯定,questionLabel通过storyboard连接到控制器

标签: ios objective-c setter init cs193p


【解决方案1】:

您可能在显示视图控制器之前设置了问题字符串属性,大概是在 prepareForSegue:?此时,视图尚未加载,标签属性仍将为 nil。

您正在执行right thing by having a separate string property,您只是错过了还必须在 viewDidLoad 中设置标签文本的步骤 - 此时您的标签已从情节提要中实例化并可以使用。

如果您在调用 viewDidLoad 之前设置属性,则标签应为 nil。如果您从 prepareForSegue 设置属性,则该视图还没有加载。视图控制器在需要在屏幕上显示它们之前不会加载它的视图和子视图,并且在执行 segue 之前不会发生这种情况 - 正如您可以猜到的那样,prepareForSegue 是在执行 segue 之前完成的。

【讨论】:

  • 如果情节提要中有标签,请不要分配/初始化标签。这就是您的标签的来源。如果您在调用 viewDidLoad 之前设置属性,则标签应为 nil。如果您从 prepareForSegue 设置属性,则该视图还没有加载。视图控制器在需要在屏幕上显示它们之前不会加载它的视图和子视图,并且在执行 segue 之前不会发生这种情况 - 正如您可以猜到的那样,prepareForSegue 是在执行 segue 之前完成的。这已经变成了一个很长的评论,我要把它添加到我的答案中......
  • 我明白了。我在 prepareForSegue 中放置了类似 segue.destinationViewController.question 的内容,它调用 setQuestion,然后尝试访问 questionLabel,在作为目标视图控制器的视图层次结构中的子视图进行 segue 期间尚未加载该问题标签。这就是 NSLog 返回 null 的原因。
  • 完全正确。您仍然应该将该代码保留在 setQuestion 中,因为您可以在视图仍在加载时再次设置问题,您只需要在 viewDidLoad 中也需要额外的位。
  • 太棒了!我的想法只是针对同一个问题:将代码 self.questionLabel.text = question; 保留在 setQuestion 中的目的是什么。如果我不需要再次设置问题怎么办?因为逻辑流程是授权展示视图控制器提问,它使用 prepareForSegue 将问题字符串发送给展示视图控制器。 segue 设置呈现的控制器。标签文本在 viewDidLoad 中设置。我不希望以任何其他方式设置标签。那么,就安全性而言,我是否应该只删除代码,从而将自定义设置器(setQuestion)全部删除?
  • 如果这就是你一直使用它的方式,那么是的,那很好。
猜你喜欢
  • 2015-02-20
  • 1970-01-01
  • 2022-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-13
相关资源
最近更新 更多