2

在我的應用程序中,我使用的是UINavigationController。我有一個「父母」UIViewController和一個「孩子」UIViewController在堆棧上運行。用戶可以對孩子進行一些設定,這些設定稍後會影響父母。我使用NSUserDefaults來保存和檢索數據,而且根據NSLog它似乎工作正常。iOS:如何在彈出其子UIViewController後「刷新」UIViewController?

我不清楚的是我一旦從孩子回來,該如何「刷新」數據。

讓我更具體:在孩子有一個「後退」按鈕,做popViewControllerAnimated,然後我們回到父母。我想重新運行viewDidLoad中的所有方法,以便使用從NSUserDefaults數據獲得的更改來設置父視圖字段。

  1. 在父方法中,我應該告訴視圖「刷新」?
  2. 如何執行此刷新操作?我應該再次調用viewDidLoad嗎?我讀了一些名爲setNeedsDisplay的東西,如果這是我應該使用的東西,語法是什麼(它是「[self。view setNeedsDisplay]」還是別的)?

任何人都可以直接和詳細說明嗎?

回答

4

看看NSNotification - 這是一種簡單的方法,可以將更新從代碼的一部分發送到另一部分,即Apple的內置NSNotification系統。

  1. 如果您有更新要發送,請致電postNotificationName。你只要給它一個你自己編寫的獨特的字符串(比如「com.razeware.imagegrabber.imageupdated」)和一個對象(比如剛剛完成下載它的圖像的ImageInfo)。

  2. 如果您想了解此更新何時發生,請致電addObserver:selector:name:object。在我們的例子中,ImageListViewController會想知道這是什麼時候發生的,所以它可以重新加載適當的表格視圖單元格。一個很好的地方是viewDidLoad。

  3. 當視圖被卸載時,不要忘記調用removeObserver:name:object。否則,通知系統可能試圖在未加載的視圖上調用方法(或者更糟的是未分配的對象),這將是一件壞事!通過雷Wenderlich blog

2

您可以使用NSUserDefaultsDidChangeNotification作爲刷新根視圖控制器的觸發器。

+0

它是一個像「 - (void)NSUserDefaultsDidChangeNotification {}」或某些行我應該寫一些地方(如果是的話,在哪裏)? –

+0

不,它是可以使用'NSNotificationCenter'類註冊的通知的名稱。以下是有關通知主題的文檔集合:http://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/Notifications/ – PeyloW

0

您還可以設置您的視圖控制器作爲代表到NavigationViewController

self.navigationController.delegate = self; 

然後你會收到委託調用方法:

- (void)navigationController:(UINavigationController *)navigationController 
     didShowViewController:(UIViewController *)viewController 
        animated:(BOOL)animated { 
    NSLog(@"Did Show controller %@", viewController); 
    // Return from child 
    if ([viewController isKindOfClass:[SRPeopleViewController class]]) { 
     [self loadData]; 
    } 

}

小缺點 - 或成本 - o如果這個解決方案是你會收到比你想要的更多的電話,所以過濾是必要的。

相關問題