2012-03-06 16 views
2

iOS開発の新機能は、developer.apple.comのチュートリアルに従っています。プログラムによるビューコントローラへのアクセス

"second ios app"チュートリアルでは、ナビゲーションコントローラベースのアプリケーションを提供しています。このアプリケーションを拡張すると、私は最初のビューコントローラとしてタブバーコントローラを持っている。

だから私は今、次のセットアップがあります。

Storyboard

すべて良いです。しかし、BirdsAppDelegate(UIApplicationDelegate)には、ルートコントローラーであるナビゲーションコントローラーに依存するコードがあり、 "datacontroller"オブジェクトを作成して割り当てることができます。 (私はタブバーコントローラを追加する前に)

これは元のコードです:それは、ルートビューコントローラがナビゲーションコントローラであると仮定しているため

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 

    UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController; 
    BirdsMasterViewController *firstViewController = (BirdsMasterViewController *)[[navigationController viewControllers] objectAtIndex:0]; 

    BirdSightingDataController *aDataController = [[BirdSightingDataController alloc] init]; 
    firstViewController.dataController = aDataController; 
    return YES; 
} 

は今、このコードは失敗します。

それが動作するように私は、コードを更新した

- しかし、私の意見では、それは醜いです、と私はビューコントローラの階層に変更を加えるたびに変更しなければなりません:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions: (NSDictionary *)launchOptions 
{ 
    // Override point for customization after application launch. 

    UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController; 

    UINavigationController *navigationController = (UINavigationController *) [[tabBarController viewControllers] objectAtIndex:0]; 

    BirdsMasterViewController *firstViewController = (BirdsMasterViewController*) [[navigationController viewControllers] objectAtIndex:0]; 

    BirdSightingDataController *aDataController = [[BirdSightingDataController alloc] init]; 

    firstViewController.dataController = aDataController; 

    return YES; 
} 

だから私の質問を上のコードで私がやっていることを行う良い方法は何ですか?階層への変更がコードを破らないようにするには?

アプリケーションデリゲートの後のビューコントローラにプログラムでアクセスして、BirdSightingDataControllerオブジェクトを作成して割り当てることができますか?

ありがとうございます!

答えて

1

配列[navigationController viewControllers]をループして、BirdsMasterViewController ...のインスタンスを探してもいいです。[obj isKindOfClass:[BirdsMasterViewController class]]を使用してください。

+0

素晴らしい - それです!素敵で簡単です:) – Stretch

0

あなたはすべてでそのコードを必要としません。コントローラーを変更したい場合は、ストーリーボードに移動し、TabBarControllerに変更するviewControllerを選択します。エディタメニューには「埋め込み」のオプションがあり、選択肢はTabBarとナビゲーションコントローラです。

enter image description here

私は常に単一のビューアプリケーションテンプレートで始まります。 "application didFinishLaunchingWithOptions:"メソッドにコードはありません(YESを返す以外は)。ストーリーボードの初期ビューとして任意のviewControllerを設定することができます。初期View Controllerのチェックボックスをオンにするか、初期ビューとして必要なviewControllerに矢印をドラッグするだけです。

Is Initial View

+0

こんにちはヒューバート - 私はあなたが私の質問を誤解したと思います。 「ルートビューコントローラを変更する方法」ではなく、プログラム的に階層を下っているビューコントローラにアクセスするにはどうすればいいですか? "applicationDidFinishLaunchingWithOptions"のコードはカスタムコードです。 "BirdSightingDataController"のオブジェクトを作成し、インスタンス変数 "BirdsMasterViewController"に割り当てる必要があります。 – Stretch

関連する問題