У меня проблемы с навигацией в приложении.Я написал игровую сцену полностью в Sprite Kit (все кнопки и т. Д., Используя SKNodes) с Objective-C.Когда пользователь открывает приложение, оно представляет главное меню, полностью встроенное в раскадровку, и содержит кнопку UIB, которая запускает переход к ViewController с моей игровой сценой.
Изначально, чтобы перезапустить игру, когда пользователь проиграл, я просто представил новую сцену, подобную этой:
GameScene *newScene = [GameScene sceneWithSize:self.view.bounds.size];
newScene.anchorPoint = CGPointMake(0.5, 0.5);
[self.view presentScene:newScene transition:[SKTransition fadeWithDuration:1]];
[self removeAllChildren];
[newScene sceneSetupWithSize:screenSize];
Где sceneSetupWithSize:(CGSize)size
- это пользовательский метод, который я использую для настройки своей игры.,К сожалению, эта новая сцена всегда имеет один и тот же неправильный размер независимо от того, какое значение я отправляю.Эта процедура также не позволяет мне вернуться обратно в главное меню.
Чтобы исправить это, я решил просто вызвать ViewController сцены.Я сделал это, создав объект ViewController в классе игровой сцены:
@property (nonatomic) GameViewController *currentController;
И затем назначив контроллер, когда ViewController загружает сцену:
sceneNode.currentController = self;
Затем я использую этот объектвызвать пользовательский метод в ViewController из класса игровой сцены следующим образом:
// In Game Scene Class
[self removeAllChildren];
[self removeAllActions];
[_currentController restart];
// In ViewController Class
- (void)restart{
NSLog(@"Restarting Scene");
NSString * storyboardName = @"Main";
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyboardName bundle: nil];
UIViewController * vc = [storyboard instantiateViewControllerWithIdentifier:@"GameView"];
vc.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
[self presentViewController:vc animated:YES completion:nil];
}
Это также позволяет мне перейти в главное меню, просто изменив идентификатор.Он работает как шарм, за исключением одной проблемы: он никогда не выталкивает старые ViewControllers из стека.Поэтому при запуске приложения каждый раз, когда я перехожу к следующему ViewController, оно добавляет ~ 40 МБ в память обработки.Это означает, что каждый раз, когда пользователь проигрывает и перезапускает игру, он занимает все больше и больше памяти.Я попытался использовать это вместо:
[self.navigationController pushViewController:vc animated:YES];
Но это просто дает мне пустой экран.Я даже пытался потом вытолкнуть контроллер тока так:
[self.navigationController popViewControllerAnimated:YES];
Но ничего не получалось.Я предполагаю, что self.navigationController
- это nil
, но я не знаю, что с этим делать.Я бы предпочел не использовать какие-либо кнопки UIB на игровой сцене.Я также предпочел бы использовать игровую сцену как есть, без необходимости воссоздавать ее в раскадровке.
Я понимаю, что есть похожие вопросы, я прочитал большинство из них, но никто не помог мне.
Спасибо всем за помощь.