2012-01-09 9 views
14

私は、ストーリーボードを使用してiOS5アプリケーションを開発しており、App DelegateからアクセスしたいView Controllerクラスのメソッドを持っています。問題は、このビューコントローラはストーリーボードのタブバーコントローラを介してインスタンス化されるため、App Delegateは、私が望むメソッドを直接呼び出す方法がない...App Delegateを使用してStoryboardを使用して作成したView Controllerにアクセスする

View ControllerをApp Delegate 、1が関係しているすべての使用である:

MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate]; 

はすでにインスタンス化ビューコントローラやクラスを指しているのも同様に簡単な方法はありますか?

答えて

10

あなたは、アプリケーションデリゲートからビューの階層を横断する必要があります。 AppDelegateUITabBarControllerへの参照を保持していると仮定すると、viewControllersプロパティまたはselectedViewControllerプロパティを使用してView Controllerにアクセスできます。あなたはUITabBarControllerを経由して、コントローラにアクセスするためにインデックスを使用するだけことができ、AppDelegateで

UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController; 
MasterViewController *result; 

//check to see if navbar "get" worked 
if (navigationController.viewControllers) 

    //look for the nav controller in tab bar views 
    for (UINavigationController *view in navigationController.viewControllers) { 

     //when found, do the same thing to find the MasterViewController under the nav controller 
     if ([view isKindOfClass:[UINavigationController class]]) 
      for (UIViewController *view2 in view.viewControllers) 
       if ([view2 isKindOfClass:[MasterViewController class]])      
        result = (MasterViewController *) view2; 
} 
+0

だから... ...その後、アプリデリゲートにストーリーボードでタブバーからの出口、とはにタブバーのプロパティを把握私が必要とするビューコントローラを見つける?ストーリーボードにもあるので、ビューコントローラ自体から直接的なアウトレットを作成しない理由は何ですか? – Amos

+6

これで、ストーリーボードからアプリケーションデリゲートへのコンセントを作成する方法がないため、私のステートメントは少し間違っていました。アプリケーションデリゲートには、ストーリーボードによって自動的に設定されるwindowプロパティがあり、それにはrootViewControllerプロパティがあります。これがストーリーボードの最初のビューコントローラーになります。そこから必要なビューに到達できるはずです。 – Jerry

+0

Bam!それはそれをしました...それはすべての意見を横断する痛みのビットですが。ありがとう、ジェリー! – Amos

15

ジェリー(上記)のおかげで、ここで私が望んで私を得たコードだ

UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController; 
firstViewController = [[tabBarController viewControllers] objectAtIndex:0]; 
secondViewController = [[tabBarController viewControllers] objectAtIndex:1]; 
thirdViewController = [[tabBarController viewControllers] objectAtIndex:2]; 

当然、タブバーの順序を変更すると、これはうんざりします。また、階層の中でより深いコントローラーを探している場合は、もう少し足取りをする必要があります。

2

10

私はおそらくそれを逆にします。 AppDelegateでregisterViewControllerなどのメソッドを作成します。すべてのViewControllerで、そのメソッド自体を名前で呼び出します。その後、AppDelegateでは、後で必要なことを行うことができます。ドリルのすべての並べ替えの任意のViewController

AppDelegateで
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; 
    [appDelegate registerViewController:@"feelings" controller:self]; 
} 

XViewController *vc = (XViewController *)[_viewControllers objectForKey:@"X"]; 
[X startSpinner]; 

ホープの

AppDelegate

- (void)registerViewController:(NSString *)name controller:(UIViewController *)controller 
{ 
    if(_viewControllers == nil) 
    { 
     _viewControllers = [[NSMutableDictionary alloc] init]; 

    } 

    [_viewControllers setObject:controller forKey:name]; 
} 

このヘルプを行うには厄介である

BS

+0

素晴らしいアイデアですが、deallocとXViewControllerは_viewControllersから削除する必要があります。私はアプリケーションの代理人でアクセスする必要があります。 – Nick

6

私はより良い解決策を持っています。 window.rootViewController.storyboardを使用すると、そのビューのストーリーボードへの参照を取得できます。あなたはストーリーボードを使用している、とあなたはストーリーボードでのViewControllerのインスタンスをしたい場合は

7

UIStoryboard *mystoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
id viewcontroller = [mystoryboard instantiateViewControllerWithIdentifier:@"identifier"]; 

を使用することができますここで「identifier」が中に特定のViewControllerの「ストーリーボードID」に与えられた名前です'Identity Inspector'の 'Identity'セクション。

+0

これはうまくいった。タブバーやナビゲーションコントローラをロードする方法についてのガイダンスはありますか? – mreynol

1

スウィフト

これは、@ infiniteLoopの答えのスウィフトバージョンです。

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
let myViewController = storyboard.instantiateViewControllerWithIdentifier("identifier") as! MyViewController 

ストーリーボード名を変更し、コントローラ名を表示し、コントローラ識別子を表示する必要があります。

関連タスク

関連する問題