簡體   English   中英

訪問模態視圖 controller parent

[英]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
}

在這里,我想出了從任何地方導航到根目錄的通用方法。

  1. 您使用此 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) }) } } }
  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];
               }
           }

如果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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM