2009-05-19 21 views
1

当我在我的自定义initWithNibName方法中编程分配一个UILabel,并在稍后在viewDidLoad中试图给它分配一个字符串时,标签没有指向任何东西。我没有发布它;标签显示在屏幕上。如果我在IB中创建标签,并在viewDidLoad中为其分配文本,它将起作用。IB对象vs手动分配的对象在init/viewDidLoad

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

从viewDidLoad中的DOC:

视图控制器加载其相关联的视图到内存中后,此方法被调用。无论视图是存储在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一样,一旦视图加载完全工作。

+0

您能否展示一些不起作用的示例代码?我不知道你的意思是“该标签没有指向任何东西” – stefanB 2009-05-19 06:55:02

+0

编辑原始帖子的澄清。 – hyn 2009-05-19 07:15:12

+0

您是否在IB中创建了UILabel是否定义为IBOutlet UILable,并且它已连接到IB上的UILabel窗口,或者您是否试图以实用的方式创建它,例如UILable * descLabel = [[...]]? – stefanB 2009-05-19 07:25:58

回答

1

如果你想以编程方式创建UILabel,你可以,但你仍然在viewDidLoad(而不是initWithNibName)中做它。

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

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

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

然后确保你将它添加到视图:

[self.view addSubview:myLabel]; 

如果需要未来的新标签访问,您将需要创建一个实例变量来保存一个指针它。

0

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

尝试

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

确保将[_descriptionLabel发布在dealloc中。这假定_descriptionLabel是一个实例变量。

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