访问模态视图控制器父项
我以模态方式呈现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
….等等,直到你到达正确的。
在这里,我想出了从任何地方导航到根的通用方法。
-
您可以使用这个类创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) }) } } }
-
您的项目中的任何地方使用:
{ ... 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]; } }