Как поменять местами два корневых контроллера - PullRequest
0 голосов
/ 05 марта 2012

У меня есть игра с двумя rootViewControllers - один для меню, а другой для самой игры.

Когда пользователь переключается между игрой и меню, я хочу переключить rootViewController.В конечном итоге мои вопросы: каков наилучший способ сделать это?Или есть другой подход для переключения стеков, который имеет больше смысла, чем наличие двух rootViewControllers?

В моем нынешнем виде в моем appDelegate есть экземпляр navigationController.Когда я хочу переключить rootViewController, я инициализирую новый navigationController, устанавливаю его rootVC, а затем устанавливаю его для экземпляра navController в appDelegate.Код для перехода из меню в игру выглядит следующим образом:

//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];

Это плохая практика ??У меня проблема с моим приложением, когда оно возобновляется из фона, и я думаю, что это может быть причиной этого.

Ответы [ 3 ]

0 голосов
/ 05 марта 2012

Возможно, вы идете хорошо, не представляя модальный контроллер представления, а используя 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 голосов
/ 06 марта 2012

Разве вы не можете просто использовать контроллер главного меню в качестве контроллера rootView и использовать его для модального проталкивания любого другого вида (или просто с использованием нового [self presentViewController:...] в iOS5)?

Даже если у вас несколькоПредставления меню Вы всегда можете получить доступ к главному меню через контроллер rootView [UIApplication sharedApplication] ??или даже [self presentingViewController]

0 голосов
/ 05 марта 2012

вы можете сделать что-то вроде этого

сначала добавьте 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.

...