2009-06-16 49 views

回答

13

我剛剛解決了這個自我同樣的問題 - 上面的答案几乎是正確的,他們只是忘記了設置委託。

我有一個根視圖控制器,顯示列表的大小,調用可能會改變列表大小的子視圖控制器,並且必須在返回時更新大小。

當我創建我的父視圖(以下SettingsView),並將其添加爲一個UINavigationController的根視圖,我一定要設置的UINavigationController的委託之前,我顯示視圖 - 這是關鍵部分:

SettingsView *sv = [[SettingsView alloc] initWithNibName:@"SettingsView" bundle:nil]; 
UINavigationController *nc = [[UINavigationController alloc] initWithRootViewController:sv]; 
[nc setDelegate:sv]; 

在父視圖,實現UINavigationControllerDelegate協議:

@interface SettingsView : UIViewController <UINavigationControllerDelegate> 

並提供willShowViewController方法:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
    // Your code to update the parent view 
} 

這是在子視圖關閉之後並在父視圖重新顯示之前調用的。

+0

謝謝,有同樣的問題。 – drew010 2012-01-31 06:43:55

6

我也需要做這樣的事情。在的ViewController是擁有我的的UINavigationController,我不得不實施willShowViewController,像這樣:

- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated { 
} 

,每當UINavigationController的更改視圖方法被調用。如果我正確理解你的問題,我認爲這應該做你想做的事。

3

我認爲這裏有一些困惑。 UIView不會被推送到UINavigationController的堆棧並從中彈出。什麼是推動和彈出是UIViewControllers,它反過來處理一個或(更經常)幾個意見。

幸運的是,UIViewController有以下方法:

-(void) viewWillAppear:(BOOL)animated; 
-(void) viewDidAppear:(BOOL)animated; 
-(void) viewWillDisappear:(BOOL)animated; 
-(void) viewDidDisappear:(BOOL)animated; 

這些被稱爲每當認爲即將(DIS)的出現,或剛剛(DIS)的出現。我使用標籤欄,模式視圖和導航控制器。 (當你實現自定義控制器時,這是一個好主意)。

所以在你的情況下,如果我理解正確,你只需重寫viewWillAppear:或viewDidAppear:你所謂的「父母頁面「(這大概是由UIViewController處理)並且放入代碼來更新頁面的外觀以反映剛輸入的數據。

(如果我沒記錯的話,你必須確保在UINavigationController得到當第一次顯示它viewWill/DidAppear:消息,爲了讓這些消息後來被髮送到其子控制器。如果你設置這個了一個模板或在IB中,您可能不必擔心它。)

0

如果您需要通知一個控制器到另一個控制器,您可以使用here (see 2nd answer)中所述的委派模式。

不幸的是,您所描述的確切任務沒有自動通知(AFAIK)。 爲了滿足您的需求,您可以在viewWillDisappear您的孩子控制器的功能發送消息給代表(即您的父母控制器)。

+1

如果你的孩子控制器有自己的孩子,這很麻煩。在這種情況下,當孩子按下孫子以及孩子彈出時,會調用「viewWillDisappear」。只有在後一種情況下,你想要通知父母。我還沒有找到解決這個問題的方法。 – 2012-05-07 10:38:17

2

Felixyz答案爲我做了詭計。調用視圖將出現方法會在每次出現視圖時運行代碼。與視圖不同的是,load僅在視圖第一次加載時運行其代碼。因此,如果子視圖改變了父視圖中顯示的信息,那麼父視圖將不會自行更新,然後從包中彈出。但是,如果父母調用視圖將出現,則每次視圖顯示備份時都會運行代碼。

請務必同時調用超級方法。正確的實施應該是這樣的:

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    NSLog(@"View Appearing"); 
} 
相關問題