15

假設我在UINavigationController中的堆棧上有2個UIViewController。在「父母」中,我們稱之爲「[self.navigationController pushViewController:childViewController animated:YES];」在一些用戶操作下,在「孩子」中我們稱之爲「[self.navigationController popViewControllerAnimated:YES];」在一些用戶的行動。iOS:如何認識到我們從父UIViewController中的子UIViewController回來?

我們如何才能在家長中認出我們剛剛回來?

是否有一些「事件」驅動的方法,可以識別這個popViewControllerAnimated動作是從孩子調用的?

回答

0

首先閱讀this,它將幫助您瞭解視圖控制器正在進行的操作。

然後在您的父視圖控制器中執行viewWillAppear:viewDidAppear:以記錄消息。

+1

但是,這並不告訴你,哪個其他控制器已被彈出。可能存在幾種不同的。但是,當然不是處於推送狀態的時候,所以OP可以簡單地跟蹤哪個控制器最後被推動。 –

1

有幾種方法可以暗示這一點。你可以做的是從父級調用popViewControllerAnimated。您可以通過將block傳遞給子控制器來執行該操作,然後該父控制器將執行彈出操作。

您還可以使用的UINavigationController委託時,一個UIViewController將被解僱通知:

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

這種方法將讓你知道哪些VC會顯示,你可以檢查當前的(尚未彈出的)VC是你正在尋找的孩子。你也可以用 - (void)viewWillAppear做一些技巧:但這可能需要一些黑客。

6

看起來好像你正在使用這個孩子控制器作爲一種模式,因爲它可以被「解僱」。如果是這種情況,請嘗試遵循Apple用於UIAlertViews的模式。

如果是這樣的話,我會執行以下任一操作來實現一個委託模式(委託vs塊是一個巨大的爭論,我不會在這裏進行討論),所以所有者(推動孩子)知道當其辭退:

  • 創建一個協議(ChildControllerDelegate),已經在這一個方法childControllerWasDismissed:(ChildController *)
  • 加塊屬性(確保它的副本屬性,不保留)到ChildController

你會t它想調用委託方法或阻止viewDidDisappear。如果您想要更細粒度的控制,請使用與viewWillDisappear/viewDidDisappear相對應的委託方法或塊。

3

我已經成功通過設置navigationController?.delegate = self解決了這個問題,然後實現此方法來確定當前視圖控制器在彈出後是否再次顯示。

func navigationController(navigationController: UINavigationController, didShowViewController viewController: UIViewController, animated: Bool) { 
     if viewController == self { 
      // we got back 
     } else { 
      // some other controller was pushed 
     } 
    } 
相關問題