2012-07-30 122 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

相關問題