2012-03-06 67 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 2012-03-06 02:56:05

0

你甚至都不需要這個代碼。如果您只想更改控制器,請轉至故事板並選擇要更改爲TabBarController的viewController。在編輯器菜單中,有一個「嵌入」選項,選項是TabBar和導航控制器。

enter image description here

我總是用一個單一的視圖應用程序模板開始。 「application didFinishLaunchingWithOptions:」方法中沒有代碼(除了返回YES)。您可以將任何viewController設置爲故事板中的初始視圖,方法是將初始視圖控制器複選框設置爲初始視圖,或將箭頭拖至您想要的視圖控制器作爲初始視圖。

Is Initial View

+0

嗨休伯特 - 我想你誤解了我的問題。它不是「如何更改根視圖控制器」,但是如何以編程方式訪問層次結構中的視圖控制器。 「applicationDidFinishLaunchingWithOptions」中的代碼是自定義代碼,需要創建一個「BirdSightingDataController」對象並將其分配給一個實例變量「BirdsMasterViewController」 – Stretch 2012-03-06 02:43:29

相關問題