2011-07-18 9 views
17

私はモーダルで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を返す...

答えて

21

私はこのような何かをする方法は、単に代理人を作成することです。 AskPasswordViewControllerのヘッダでは、実装ファイルでそれを合成

id delegate; 

@property (nonatomic, assign) id delegate; 

を置きます。その後、モーダルコントローラを割り当て/初期化した後、それを提示する前にmodalViewController.delegate = self;と設定します。その後、モーダルコントローラ内で、self.delegateを呼び出して、それを提示したビューコントローラから情報を取得できます。

self.presentingViewController 

リンゴのドキュメントを1として:私は、これはあなたが呼び出すことによって、親にアクセスすることができます

+0

ありがとうございます。それが私が最後にやったことです。しかし、親ビューコントローラがタブバーである理由を理解したいと思います。それは本当に変だと思うし、私はどこかで何か間違ったことをするのは恐れている。 –

+1

なぜ私は完全にはわかりませんが、私の理論は、モーダルビューを提示しているので、必ずしもそれを提示するビューコントローラの子ではなく、その一部です。したがって、その親はビューの親であり、拡張子として表示されます。それはナビゲーションコントローラ – justin

+0

を介してビューをプッシュするのとは対照的に、この側面では異なる動作をしているようです。しかし、私はクラスの代理人を "parentviewcontroller"にしなければなりませんでした。私は "parentviewcontroller"のuitabbarにアクセスしたいと思っていました。 – Chrizzz

5

あなたはいつも戻って、さらに行くことができます次のようにparentViewControllerを呼び出すだけです:

self.parentViewController.parentViewController ....などまであなたは正しいものに到達します。

+0

私は、viewControllerをプッシュするnavigationControllerを提示するタブバーを持っています。これは厄介なviewControllerを提示します。 –

+0

あなたの質問では、よく私たちにあなたのmodalviewcontroller archtecture vc1 - > vc2 - > nvc - > tbvcを教えてくれるようなフィードバックを与え、どこからどこに行きたいか教えてください。 – Cyprian

+2

実際のクラス名を表示するには、次のようにします: 'NSLog(@" clase:%@ "、NSStringFromClass [[self parentViewController] class])); – Cyprian

75

に役立ちます願っています(。またはその 最も遠い祖先)

このビューコントローラを発表ビューコントローラ

+4

他のコメントは当時のものだったが、これはストーリーボード(特にiOS 7以来)に行く方法だと思う。 – Robin

+5

ちょうどFYIこれはviewDidLoadでnilになります – user3344977

0
//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]; 
       } 
      } 
1

ここで私は、任意の場所からルートにナビゲートすることができます。

{ 
    ... 
    SharedControllers.navigateToRoot(self) 
    ... 
} 
:どこでもあなたのプロジェクト内から

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) 
      }) 
     } 
    } 
} 
  • 使用法:それはどこでもあなたのプロジェクト内からアクセス可能なように

    1. あなたは、このクラスで新しいクラスファイルを作成します

  • 1

    Vibhor Goyalに追加 - self.presentingViewControllerがNavigationControlleとして登録されることがありますr。したがって、try:

    if let vc = self.presentingViewController.childViewControllers.last as? YourViewController { 
    // do stuff here 
    } 
    
    関連する問題