DRYな備忘録

Don't Repeat Yourself.

【iOS】AppDelegateからViewControllerを取得

問題

requestAccessToAccountsWithTypeなど、UIApplicationに帰属するメソッドのコールバックを受けてViewを変えたいときは、AppDelegateクラスの中でViewControllerを取得せざるを得ない(と思う)。ので、そのメモ。

ゴール

  • AppDelegate内で、定義済みのViewControllerを取得し、そのメソッドを叩ける

解決

(プロジェクト名をFooとしてます)

ViewControllerにIdentityを設定しないといけない

これを設定しとかないと名前で参照できない(適当にhoge

f:id:otiai10:20140816115100j:plain

AppDelegateからViewControllerを取得

一例としてAppDelegateクラスのdidFinishLaunchingWithOptionsを用いる。この中で以下のように書く

FooAppDelegate.m

#import "FooAppDelegate.h"
// ↓これをimportしないとFooViewControllerに定義されたメソッド呼べない
#import "FooViewController.h"

@implementation FooAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Mainストーリーボードを取得
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    // ストーリーボードに定義されているViewControllerをidentityで取得
    FooViewController *viewController = [storyboard instantiateViewControllerWithIdentifier:@"hoge"];
    // FooViewControllerに定義されているメソッド呼べるかテスト
    [viewController bar];
    return YES;
}

参考

DRYな備忘録