2009-05-19 20 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創建的任何對象。