访问模态视图控制器父项

我以模态方式呈现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 …

我会这样做的方式是简单地创build一个委托。 在AskPasswordViewController的头部,放

 id delegate; 

 @property (nonatomic, assign) id delegate; 

在实现文件中将其合成。 然后,当你分配/初始化模态控制器之前,你提交它,设置modalViewController.delegate = self; 。 然后在模态控制器中,您可以调用self.delegate从显示它的视图控制器获取信息。 我希望这有帮助

您可以通过以下方式访问家长:

 self.presentingViewController 

按照苹果文档:

呈现这个视图控制器(或其最远的祖先)的视图控制器。

您可以随时调用parentViewController,如下所示:

self.parentViewController.parentViewController ….等等,直到你到达正确的。

在这里,我想出了从任何地方导航到根的通用方法。

  1. 您可以使用这个类创build一个新的Class文件,以便在项目的任何地方都可以访问它:

     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) }) } } } 
  2. 您的项目中的任何地方使用:

     { ... SharedControllers.navigateToRoot(self) ... } 
 //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]; } }