2012-06-20 80 views
0

我有一個基於UINavigationController的應用程序。有一個菜單屏幕,其按鈕可以繼續(按到導航控制器堆棧上)到9個其他「子屏幕」中的一個。這些子屏幕都沒有延伸到任何其他屏幕。當用戶在「子屏幕」上輸入數據時,他們可以按下完成按鈕,這將彈出到原始菜單屏幕。 (如果你有困難想象這一點,想象一個樹狀故事板,其中有一個根ViewController,然後是9個葉子viewControllers)。iOS中的ViewDidLoad和UINavigationController?

好吧,所以使用該設置我有幾個關於viewDidLoad如何工作的問題。

〜首先,viewDidLoad應該在每次我們轉換到子屏幕時調用。例如,假設我從菜單屏幕轉到子屏幕「B」,回到菜單屏幕,然後返回到子屏幕「B」。如果B的viewDidLoad方法被調用兩次?如果沒有,爲什麼我會被叫兩次?

〜其次,假設它每次都會被調用,如果我有很多長操作需要每次子屏幕一次執行一次,我該怎麼辦?我應該在哪裏放置它們(如果我將它們放在viewDidLoad中,如果用戶在此頁面和菜單之間來回切換,會發生多次)?

回答

1

回答您的問題:

  1. 是的,在一般B的viewDidLoad方法應該每次它送到UINavigationController上的堆棧時調用。這是因爲每當B從堆棧中彈出時,它通常會被釋放,並且每次您到B時都會創建一個新的B實例。

  2. 可能有很多方法來處理這種情況。沒有確切地看到你想要做什麼,很難判斷什麼是對的。一種方法是創建一個處理處理的singleton object。這可能比在你的UIViewController中處理它更好的原因是一個單例可以在應用程序的整個生命週期中生存,而UIViewControllers通常具有相對較短的壽命。 Singleton對象只能創建一次,並且可以管理在應用程序的整個生命週期中需要保留的任何操作和數據。

+0

viewDidLoad每次被視爲「初始化」而不是每次被添加到堆棧時都會被調用 – sunrize920

+0

我在我的回覆中解釋說:「每次B彈出堆棧時,發佈,每次你去B B創建一個新的實例「又名init/viewDidLoad將被稱爲每次你訪問B. –

+0

我不會說這是典型的發佈。當視圖屬性被釋放/設置爲零時,viewDidUnload僅在視圖控制器上被調用,並且這通常僅在應用程序收到內存警告時纔會發生。 – sunrize920

0

viewWillAppear每次出現視圖時都會被調用。 viewDidLoad只有在構建視圖時纔會調用 - 例如在訪問視圖時調用視圖控制器initFromNibNamed之後。 viewWillAppear被稱爲任何時候你的視圖控制器不在視圖中,但進入視圖 - 所以當你的視圖控制器被推動時,viewWillAppear被調用。所以你可能會認爲你的號碼被稱爲兩次,但事實上它可能不是。所以你應該把方法放在viewDidLoad。你在做什麼需要很長時間?

0

1. viewDidLoad在視圖加載時調用,viewWillAppear在視圖變爲可見時調用。

如果您的viewDidLoad被多次調用,這意味着您每次顯示視圖時都加載視圖,並在每次彈出視圖時將其釋放。如果您發佈了一些代碼,我可以幫助您更好地發現問題。

你可以做的是這樣的:

在你的「根」的viewController類,聲明每個「葉子」的ViewController的一員,可以說,他們被稱爲leafController1,leafController2等,併爲保留的屬性他們。

@interface YourRootViewController : UIViewController { 
    LeafController1Class *leafController1; 
    LeafController2Class *leafController2; 
    // ... 
} 

@property (nonatomic, retain) LeafController1Class *leafController1; 
@property (nonatomic, retain) LeafController2Class *leafController2; 

// ... 

@end 

在你的頂部視圖控制器的viewDidLoad中,使用「initWithNibName」等(或任何你正在做創建它們)初始化所有的葉控制器。保留他們的情況下,像這樣:

self.leafController1 = [[[LeafController1Class alloc] initWithNibName:@"LeafController1NibName" bundle:nil] autorelease]; 

當用戶按下一個按鈕,按下正確的葉到navigationcontroller:

[myNavigationController pushViewController:leafController1 animated:YES]; 

如果現在流行的葉控制器,因爲它們會被保存在內存中你保留了它們。 這樣你的viewDidLoad只會爲每個葉子調用一次,只要你總是將相同的視圖控制器的實例推送到你的navigationcontroller。

2. 與視圖相關的重碼應在視圖載入時執行,即由viewDidLoad觸發。但也可能是一個好主意,讓其他類保存有關您的應用程序的信息,這些信息不是視圖控制器,並與UI分離。大量計算最好在後臺進行,或者第一次加載應用程序。

相關問題