Я видел пост о том, как это сделать, здесь Изменение контроллера Root View контроллера UINavigationController И различные другие посты на SO.Но ...
Я реализовал другое решение, которое кажется более простым, однако мне было интересно, есть ли в этом подходе что-то в корне ошибочное, поскольку я не видел, чтобы он использовался или описывался где-то еще, и моя уверенность вмой собственный код не очень высокий.Я также думаю, что мой подход может быть причиной другой проблемы, о которой я упомяну в конце.
В моем appDelegate есть переменная UINavigationController, которая называется navController.Когда игра загружается, я проверяю сохраненные данные.Если он существует, я инициализирую navController с основным видом игры как rootViewController.Если ничего не существует, я инициализирую navController в меню rootViewController и загружаю его вместо этого.Если пользователь переходит из меню в игру или из игры в меню, я инициализирую новый rootViewController и устанавливаю его в переменную navController appDelegate, а затем отображаю его.Вот код в методе didFinishLaunchingWithOptions моего приложения:
NSFileManager *fileManager = [[NSFileManager alloc] init];
if ([fileManager fileExistsAtPath:[self dataFilePath]]) {
self.saveDataExists = TRUE;
GameViewController *gameViewController = [[GameViewController alloc] init];
UINavigationController *gameNavController = [[UINavigationController alloc] initWithRootViewController:gameViewController];
[gameViewController release];
self.navController = gameNavController;
[gameNavController release];
}
else {
self.saveDataExists = FALSE;
MainMenuViewController *mainMenuViewController = [[MainMenuViewController alloc] init];
UINavigationController *menuNavController = [[UINavigationController alloc] initWithRootViewController:mainMenuViewController];
[mainMenuViewController release];
self.navController = menuNavController;
[menuNavController release];
}
[fileManager release];
[window addSubview:navController.view];
[window makeKeyAndVisible];
Вот код, когда пользователь переходит из меню в игру:
// 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.
MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegate.navController = newNavController;
[newNavController release];
И из игры в меню:
MainMenuViewController *menuViewController = [[MainMenuViewController alloc] init];
UINavigationController *newNavController = [[UINavigationController alloc] initWithRootViewController:menuViewController];
[menuViewController release];
newNavController.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[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.
self.appDelegate.navController = newNavController;
[newNavController release];
Вроде нормально работает, утечек памяти нет и переход быстрый.Но у меня такое чувство, что это неправильно.Я оставил его больше года, но недавно я интегрировал HeyZap SDK (игровая социальная сеть, где пользователи регистрируются в игре).Вход в HeyZap загружает приложение HeyZap, а затем возвращается в игру по заданной вами схеме URL.Если я загружаю HeyZap из меню моей игры, он возвращается в игру очень хорошо.Однако, если я загружаю HeyZap из игры, он вылетает при возврате (без вывода ошибок).Мне интересно, может ли это быть из-за того, что приложение не знает, какой RootVC загружается.Но обычно я могу нормально переключаться между приложениями ... У меня есть две схемы URL - одна для Facebook, а другая для HeyZap, и они выглядят так:
Любыесовет очень ценится!Спасибо, Майкл.