Как программно перемещаться по приложению Objective-C без использования только раскадровки? - PullRequest
0 голосов
/ 20 июня 2019

У меня проблемы с навигацией в приложении.Я написал игровую сцену полностью в 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 на игровой сцене.Я также предпочел бы использовать игровую сцену как есть, без необходимости воссоздавать ее в раскадровке.

Я понимаю, что есть похожие вопросы, я прочитал большинство из них, но никто не помог мне.

Спасибо всем за помощь.

1 Ответ

0 голосов
/ 21 июня 2019

Это заняло у меня слишком много времени, чтобы понять.То, что я пытался сделать, это просто изменить корневой вид.Этот код решает мою проблему:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
UIViewController * vc = [storyboard instantiateViewControllerWithIdentifier:@"GameView"];
vc.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
UIApplication.sharedApplication.delegate.window.rootViewController = vc;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...