2009-08-07 86 views
0

我有一個navController和tableViewController設置,使得選擇一個錶行將在navController的堆棧上推送一個詳細視圖並顯示有關所選行的詳細信息。在詳細視圖中,我使用單個UILabel來顯示信息,並將該標籤文本屬性的值設置爲詳細視圖控制器的viewDidLoad中。切換到詳細視圖時不能多次更改UILabel.text

我第一次選擇一行時,詳細視圖會顯示預期的文字。當我回到表視圖並選擇不同的行時,詳細視圖與第一次相同的文本。

我已經看到了一些代碼示例,其中詳細視圖控制器被釋放,然後在被推入navController的堆棧後設置爲零。如果我將其添加到我的代碼中,問題就會消失,但我不明白爲什麼。

有人可以向我解釋這裏發生了什麼?

謝謝!

回答

1

-viewDidLoad只有當...加載視圖時才被調用。也就是說,當它在內存中創建時,這是您第一次創建視圖控制器。任何基於自定義的輸入數據都應該在-viewWillAppear:中完成,而每次在將其推入導航控制器之前都會調用它。

儘管在一般情況下,我總是在將它推到堆棧後立即釋放一個新的視圖控制器,因爲它不再屬於我,它屬於導航控制器。在這種情況下,下次您將它推入堆棧時,它將再次加載視圖,因爲它是一個新對象。

- (void) tableView:(TableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    UIViewController *screen = [[MyNewViewController alloc] initWithData:[data objectAtIndex:indexPath.row]]; 
    [self.navigationController pushViewController:screen animated:YES]; 
    [screen release]; 
} 

主要思想,雖然是定製基礎上可能會改變每次你看到的視圖應在-viewWillAppear:完成時間數據的視圖。在界面生成器中進一步定製視圖,改變不會改變的東西,不管你在看什麼數據,都應該在-viewDidLoad

+0

埃德,謝謝。這是非常有意義的,我的代碼現在都在工作,我明白爲什麼! – skantner 2009-08-07 14:52:40