IB对象与init / viewDidLoad中手动分配的对象

时间:2009-05-19 06:46:11

标签: iphone cocoa-touch

当我以编程方式在我的自定义initWithNibName方法中分配UILabel时,稍后在viewDidLoad中尝试为其分配字符串时,标签未指向任何内容。我没有释放它;标签显示在屏幕上。如果我在IB中创建标签,并在viewDidLoad中为其指定文本,则可以正常工作。

在viewDidLoad中设置手动分配的对象是否违反规则? 为什么它没有指向任何东西,即使在我的init之后调用了viewDidLoad?

来自viewDidLoad的文档:

  

在视图控制器将其关联的视图加载到内存后调用此方法。无论视图是存储在nib文件中还是以编程方式在loadView方法中创建,都会调用此方法。此方法最常用于对从nib文件加载的视图执行其他初始化步骤。

在我的初学者:

_descriptionLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 218, 280, 10)];
    _descriptionLabel.numberOfLines = 0;
    _descriptionLabel.lineBreakMode = UILineBreakModeWordWrap;
    _descriptionLabel.font = [UIFont systemFontOfSize:12.0];
    _descriptionLabel.adjustsFontSizeToFitWidth = NO;
    _descriptionLabel.text = @"Description not found.";
    _descriptionLabel.backgroundColor = [UIColor clearColor];

在viewDidLoad中,变量的值为0x0。 我手动分配的UIButton也是如此,一旦视图加载就完全正常工作。

2 个答案:

答案 0 :(得分:1)

如果你想以编程方式创建UILabel,你可以在viewDidLoad(而不是initWithNibName)中进行。

不要害怕在viewDidLoad中进行UI设置。它提供了在视图出现在屏幕上之前添加任何静态UI元素。

直到调用viewDidAppear:(BOOL)动画之前,视图才会出现。

如果你有动态内容,请在viewWillAppear:(BOOL)动画中配置它。 (这看起来像你的情况)

然后确保将其添加到视图中:

[self.view addSubview:myLabel];

如果您将来需要访问新标签,则需要创建一个ivar来保存指向它的指针。

答案 1 :(得分:0)

在发布的代码中,_descriptionLabel UILabel不会被保留,并且会在绘制视图之前释放。

尝试

_descriptionLabel = [[[UILabel alloc] initWithFrame:CGRectMake(20, 218, 280, 10)] retain];

确保将[_descriptionLabel release]放在dealloc中。这假定_descriptionLabel是一个实例变量。

这基本上适用于您使用alloc,copy或new创建的任何对象。