Изменение RootViewController UINavigationController - PullRequest
1 голос
/ 27 февраля 2012

Я видел пост о том, как это сделать, здесь Изменение контроллера 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, и они выглядят так:

info plist file

Любыесовет очень ценится!Спасибо, Майкл.

...