2011-07-18 157 views
17

我以模態方式呈現ViewController。 如何訪問父視圖控制器?我的體系結構是TabBarController => VC1 => VC2 => VC3 => MVC1,我想從MVC1到VC3。訪問模式視圖控制器父

在VC3,我有這樣的代碼:

- (void) editAd{ 
    AskPasswordViewController *modalViewController = [[AskPasswordViewController alloc] initWithNibName:@"AskPasswordView" bundle:nil]; 

    NSLog(@"modalparent class=%@", [[modalViewController parentViewController] class]); 

    [self presentModalViewController:modalViewController animated:YES]; 
    [modalViewController release]; 
} 

我想這在MVC1:

- (void) sendRequest { 
    NSLog(@"classe : %@",[[self parentViewController] class]); 
} 

但它返回我的TabBarViewController ...

回答

21

我會這樣做的方式是簡單地創建一個委託。在AskPasswordViewController的頭,把

id delegate; 

@property (nonatomic, assign) id delegate; 

合成它在實現文件。然後,在分配/初始化模態控制器之後,在出現之前,設置modalViewController.delegate = self;。然後在模態控制器中,您可以撥打self.delegate從顯示它的視圖控制器獲取信息。我希望這有助於

+0

謝謝。這就是我最後所做的。但我想了解爲什麼父視圖控制器是tabbar。這似乎很奇怪,我害怕在某個地方做錯了事。 –

+1

我不完全確定爲什麼,但我的理論是,因爲你正在呈現模態視圖,所以它不一定是視圖控制器的一個孩子,而是它的一部分。因此它的父母是視圖的父母,因爲它是一個擴展。它在這方面似乎有不同的行爲,而不是通過導航控制器 – justin

+0

推送視圖,它也適用於我。但是我必須讓類「parentviewcontroller」的委託。我想訪問「parentviewcontroller」的uitabbar。 – Chrizzz

5

您可以隨時退回到更久遠只需通過調用parentViewController像這樣:

self.parentViewController.parentViewController ....等等等等你到達正確的一個。

+0

我有一個tabbar,它提供了navigationController,它推送了一些viewcontroller,它提供了惱人的viewController。 –

+0

以及你的問題給我們一個反饋,就像告訴我們你modalviewcontroller架構vc1 - > vc2 - > nvc - > tbvc然後告訴我們從哪裏到哪裏你想得到。 – Cyprian

+2

要打印acctual類名稱使用:NSLog(@「clase:%@」,NSStringFromClass [[self parentViewController] class]));' – Cyprian

75

你可以通過調用訪問父:

self.presentingViewController 

按照蘋果的文檔:(或其 最遠的祖先)

所呈現這個視圖控制器視圖控制器

+4

雖然其他評論正確的時候,我認爲這是故事板的方式(尤其是iOS 7以後) – Robin

+5

只是一個參考,這將是無效的viewDidLoad – user3344977

0
//You have to get the root, iterate through the root's ViewControllers and then ask for the ParentViewController. 
    UINavigationController ​*root = (UINavigationController*​)[[(AppDelegate*) [[UIApplication sharedApplication]delegate] window] rootViewController]; 
      for (UIViewController *VC in root.viewControllers) { 
       if([VC isKindOfClass:[YourParentViewController class]]){ 
        YourParentViewController* parent = (YourParentViewController*)VC; 
        [parent callMethod]; // your code here 
        [self dismissViewControllerAnimated:YES completion:nil]; 
       } 
      } 
1

在這裏,我想出了通用l方法從任何地方導航到根。

  1. 你創建這個類一個新的類文件,以便它可以訪問在你的項目中的任何地方:

    { 
        ... 
        SharedControllers.navigateToRoot(self) 
        ... 
    } 
    
:從您的項目中的任何地方

import UIKit 

class SharedControllers 
{ 
    static func navigateToRoot(viewController: UIViewController) 
    { 
     var nc = viewController.navigationController 

     // If this is a normal view with NavigationController, then we just pop to root. 
     if nc != nil 
     { 
      nc?.popToRootViewControllerAnimated(true) 
      return 
     } 

     // Most likely we are in Modal view, so we will need to search for a view with NavigationController. 
     let vc = viewController.presentingViewController 

     if nc == nil 
     { 
      nc = viewController.presentingViewController?.navigationController 
     } 

     if nc == nil 
     { 
      nc = viewController.parentViewController?.navigationController 
     } 

     if vc is UINavigationController && nc == nil 
     { 
      nc = vc as? UINavigationController 
     } 

     if nc != nil 
     { 
      viewController.dismissViewControllerAnimated(false, completion: 
       { 
        nc?.popToRootViewControllerAnimated(true) 
      }) 
     } 
    } 
} 
  • 用法

  • 1

    除了Vibhor Goyal - 有時,self.presentingViewController註冊爲NavigationControlle河因此,請嘗試:

    if let vc = self.presentingViewController.childViewControllers.last as? YourViewController { 
    // do stuff here 
    }