Доступ к контроллеру modal view parent

Я представляю ViewController модально. Как я могу получить доступ к контроллеру родительского представления?

Моя архитектура - TabBarController => VC1 => VC2 => VC3 => MVC1, и я хочу достичь VC3 из MVC1.

В 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...

Ответ 1

То, как я собираюсь что-то вроде этого, - просто создать делегата. В заголовке AskPasswordViewController

id delegate;

а также

@property (nonatomic, assign) id delegate;

Синтезируйте его в файле реализации. Затем после того, как вы выделите/инициализируете модальный контроллер и перед его представлением установите modalViewController.delegate = self; , Затем в self.delegate контроллере вы можете вызвать self.delegate чтобы получить информацию от контроллера представления, который его представил. надеюсь, это поможет

Ответ 2

Вы можете получить доступ к родителям, позвонив:

self.presentingViewController

Согласно документации на яблоко:

Контроллер представления, который представил этот контроллер представления (или его самый дальний предок).

Ответ 3

Вы всегда можете вернуться назад, просто вызвав parentViewController следующим образом:

self.parentViewController.parentViewController.... и так далее, пока вы не достигнете правильного.

Ответ 4

Здесь я придумал универсальный метод навигации из любого места в корень.

  1. Вы создаете новый файл класса с этим классом, чтобы он был доступен из любого места вашего проекта:

    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)
        ...
    }
    

Ответ 5

Дополнение к Vibhor Goyal - Иногда self.presentingViewController регистрируется как NavigationController. Поэтому попробуйте:

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

Ответ 6

//You have to get the root, iterate through the root 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];
               }
           }