[英]Access modal view controller parent
我正在模態地展示一個 ViewController。 如何訪問父視圖 controller?
我的架構是 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 ...
您可以通過調用訪問父級:
self.presentingViewController
根據蘋果文檔:
呈現此視圖 controller(或其最遠的祖先)的視圖 controller。
我對 go 這樣的事情的方式是簡單地創建一個委托。 在AskPasswordViewController
的 header 中,放
id delegate;
和
@property (nonatomic, assign) id delegate;
在實現文件中合成它。 然后在分配/初始化模態 controller 之后,在呈現它之前,設置modalViewController.delegate = self;
. 然后在模態 controller 中,您可以調用self.delegate
從呈現它的視圖 controller 中獲取信息。 我希望這有幫助
您總是可以通過調用 parentViewController 來進一步返回 go ,如下所示:
self.parentViewController.parentViewController
.... 依此類推,直到找到正確的。
Vibhor Goyal 的補充 - 有時,self.presentingViewController 注冊為 NavigationController。 因此嘗試:
if let vc = self.presentingViewController.childViewControllers.last as? YourViewController {
// do stuff here
}
在這里,我想出了從任何地方導航到根目錄的通用方法。
您使用此 class 創建一個新的 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];
}
}
如果presentingViewController
給了你意想不到的結果,而你又不想擺弄它,那就這樣做:
class MyViewController: UIViewController {
private weak var presenter: UIViewController?
init(presenter: UIViewController) {
self.presenter = presenter
super.init(nibName: nil, bundle: nil)
...
}
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.