2011-09-14 41 views
2

當我的視圖控制器第一次出現時,我希望它可能更新提供該視圖數據的緩存。但是,當用戶從深層視圖控制器點擊後退按鈕返回到此視圖控制器時,我不想再次更新緩存。UINavigationController中第一次加載視圖控制器的事件?

我應該使用哪個事件?

  • in init,我沒有我需要的所有參數。
  • viewWillAppear將在每次出現視圖時被觸發。
  • viewDidLoad將在每次從筆尖加載視圖時觸發,如果存在內存警告,我認爲這會再次發生。 (或者這是錯誤的?)由於這是而不是一個內存駐留緩存,它似乎是處理這個錯誤的地方。
  • 讓調用者調用額外的東西不雅,如果有內置的方式來處理這個問題。

澄清,這不是內存駐留緩存。這是將XML文件解析爲二進制文件。二進制文件在viewDidLoadviewDidUnload中加載和卸載。這是該步驟的先決條件,確保二進制文件在加載之前是最新的。

回答

1

使用init可能工作,但我會推薦一個簡單的子類UINavigationController。創建一個名爲setRootTableViewController:(UITableViewController *)controller的新方法,或者類似的東西。在方法的實現調用此:

[controller.tableView reloadData]; 
[self pushViewController:controller animated:NO]; 

reloadData會打電話給你所有的委託和數據源的方法,並用它們來更新表。如果您希望在您的表視圖控制器上調用特殊的方法,則可以將方法聲明更改爲setRootTableViewController:(CustomTableViewController *)controller(或任何您的自定義表控制器稱爲),並將reloadData行替換爲調用該方法的行。

然後,在您的應用程序委託中,而不是創建UINavigationController並添加您的自定義視圖控制器,創建其中一個,然後調用此方法添加第一個視圖。

但是,如果您使用的是筆尖設置rootViewController,你可以只覆蓋initWithRootViewController:(UIViewController *)controller,因爲我想象那是什麼筆尖將調用設置第一個視圖中的堆棧:

- (id)initWithRootViewController:(UIViewController *)rootViewController { 
    if ((self = [super init])) { 
    [(CustomController *)rootViewController doSomethingSpecial]; 
    [self pushViewController:rootViewController]; 
    } 
} 

希望這有助於!

+0

也在一個4。0+環境下,應用程序可能會在後臺進入後臺幾個小時纔會回到前臺,您可能需要注意並重新載入緩存 - 也許您應該在重新載入時設置一個時間戳,並根據該值決定 – bshirley

0

加載viewDidLoad中的緩存並將其釋放到viewDidUnload和dealloc中。

viewDidUnload在低內存條件下被調用。如果你想讓你的應用程序保持響應,你可以釋放盡可能多的內存。

很好地解釋了這裏:When should I release objects in -(void)viewDidUnload rather than in -dealloc?

+0

我澄清了我的問題,解釋了爲什麼這不是我正在尋找的答案。但是,謝謝。 :) –

相關問題