Доступ к контроллеру 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
Здесь я придумал универсальный метод навигации из любого места в корень.
-
Вы создаете новый файл класса с этим классом, чтобы он был доступен из любого места вашего проекта:
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)
...
}
Ответ 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];
}
}