0

我有一個帶有兩個rootViewControllers的遊戲 - 一個用於菜單,另一個用於遊戲本身。如何在2個根視圖控制器之間進行交換

當用戶在遊戲和菜單之間切換時,我想切換rootViewController。最終我的問題是,做到這一點的最佳方式是什麼?或者是否有另一種切換堆棧的方法比擁有2個rootViewController更有意義?

現在,我的appDelegate中有一個navigationController的實例。當我想切換rootViewController時,我初始化一個新的navigationController,將其設置爲rootVC,然後將其設置爲appDelegate中navController的實例。從菜單轉換到遊戲的代碼如下所示:

//Initialise the new Root Controller 
GameViewController *rootController = [[GameViewController alloc] init]; 

UINavigationController *newNavController = [[UINavigationController alloc] initWithRootViewController:rootController]; 
[rootController release]; 
newNavController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal; 
[self presentModalViewController:newNavController animated:YES]; 

//Setting the appDelegate's navController to the new navController allows the menu to dealloc. 
//This must happen AFTER the newNavController has been loaded. 
MiniAppDelegate *appDelegate = (MiniAppDelegate *)[[UIApplication sharedApplication] delegate]; 
appDelegate.navController = newNavController; 
[newNavController release]; 

這是不好的做法嗎?我的應用程序在從後臺恢復時遇到問題,我認爲這可能是導致它的原因。

+0

是否有任何具體的原因,你沒有使用Cocos2d框架來建立你的遊戲? Cocos2d在不同的場景和圖層之間切換非常容易。 – azamsharp 2012-03-05 17:10:35

+0

當我最初構建應用程序時,我沒有看到Cocos2d,現在對它進行改造有點晚了...但是我可能會將它用於下一個應用程序。 – Smikey 2012-03-05 17:14:19

回答

0

您可能不會呈現模式視圖控制器,而是使用管理底層視圖控制器的UIViewController

與此類似:

// MainNavigationController extends UINavigationController 

@property (nonatomic,retain) UIViewController childViewController 

-(void)viewDidLoad { 
    self.childViewController = [MenuViewController alloc] initWithNibName...]; 
    [self pushViewController:childView...]; 
} 

-(void)launchGame { 
    self.childViewController = [GameViewController alloc] ... ]; 
    self.viewControllers = [NSArray array]; 
    [self pushViewController:childView...]; 
} 

這樣你持有一個參考當前視圖控制器的所有的時間和管理它們的顯示在同一個地方。

您還應該同時傳遞子視圖控制器對MainNavigationController的引用,以便您可以使用委託方法。

編輯:

要澄清的東西關於第一註釋了一下:是的,MainNavigationController是您的應用程序的起點,它處理的菜單和遊戲本身的顯示。

self.viewControllers = [NSArray array]用於在啓動遊戲時清空當前視圖控制器的列表。這樣做是爲了用遊戲代替菜單,而不是僅僅推動它。這樣,當用戶進入菜單,遊戲,菜單等時,您沒有8個視圖控制器。

在玩遊戲時會使用類似的方法打開菜單:按鈕會要求MainViewController打開菜單。您可以像launchGame方法一樣工作,或者您可以然後爲您提供保持遊戲狀態的模式方法,或者在此之前或之後放置一個較小的遊戲菜單 - 可以使用多種方法處理。

+0

那麼我應該在appDelegate中創建一個MainNavigationController的實例嗎?每當我想在navControllers之間切換時,我都會引用這個實例?你的意思是self.viewControllers = [[NSArray array] arrayWithObject:self.childViewController];我不太遵循代碼... – Smikey 2012-03-05 17:24:33

+0

編輯我的帖子來詳細說明這一個 – 2012-03-05 17:53:04

+0

對 - 我想我明白了。之前沒有使用類擴展(與類別相反)。在瞭解了它們之後,我明白這是一種在任何類的頭文件或實現文件中聲明所需方法的方法......然後在實現相同類的過程中定義這些方法。所以我創建了一個'@interface UINavigationController()'行和你的方法聲明,但是我可以把它放在任何地方?在這種情況下,我把它放在哪一類?如果我在X代碼中創建一個新的「Objective-C類擴展」,它只會創建一個頭文件,而不是實現。有點困惑..但是,謝謝! – Smikey 2012-03-06 12:17:37

0

你可以做這樣的事情

首先作爲一個字段添加GameViewController到菜單控制器

,然後用它來顯示它(在菜單控制器類)

if(myGameViewController == nil) { 
    myGameViewController = [[GameViewController alloc] 
    initWithNibName: @"GameView" bundle: nil]; 
} 
[self presentModalViewController: self.myGameViewController animated:YES]; 

和然後用它來刪除它(在GameViewController類中)

[self.parentViewController dismissModalViewControllerAnimated: YES]; 

什麼是打開遊戲視圖作爲菜單視圖的孩子這需要至少GameViewController是一個UIViewController而不是一個RootViewController。

+0

接下來的問題是,如果我使用類似[self.navigationController pushViewController:anotherViewController animated:YES]的方式推送遊戲視圖中的後續viewController;沒有發生什麼事,因爲它可能是推動新的VC到菜單堆棧不可見... – Smikey 2012-03-05 16:49:18

+0

你可以使用'[self presentModalViewController:self.myGameViewController animated:YES];'在UIViewController頂部推一個新的視圖'所以你可以讓菜單視圖推動遊戲控制器和遊戲視圖推送後續視圖,它應該工作。我有一個應用程序,正是這樣做與各種UIViewControllers。 – twain249 2012-03-05 17:03:28

+0

但是,那麼你失去了導航欄,並且必須爲每個你呈現的VC手動配置它,以獲得你在推動時自動繼承的行爲? – Smikey 2012-03-05 17:19:23

0

難道你不能只使用你的主菜單控制器作爲rootView控制器,並使用它來模態地推動其他視圖(或僅使用iOS5中的新[self presentViewController:...])?

即使您擁有多個菜單視圖,您仍然可以通過[UIApplication sharedApplication]的rootView控制器訪問主菜單?甚至[self presentingViewController]

相關問題