gpt4 book ai didi

ios - 如何在不使用 Storyboard的情况下以编程方式导航 Objective-C 应用程序?

转载 作者:行者123 更新时间:2023-11-29 05:39:36 27 4
gpt4 key购买 nike

我在浏览我的应用程序时遇到问题。我已经用 Objective-C 在 Sprite Kit 中完全编写了一个游戏场景(所有按钮等使用 SKNodes)。当用户打开应用程序时,它会显示一个完全在 Storyboard 中构建的主菜单,并包含一个 UIButton,该 UIButton 会触发到 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 加载场景时分配 Controller :

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

这还允许我只需更改标识符即可导航到主菜单。除了一个问题之外,它的工作方式就像一个魅力:它永远不会从堆栈中弹出旧的 ViewController。因此,运行应用程序时,每次导航到下一个 ViewController 时,它都会向处理内存添加约 40MB。这意味着每次用户输掉并重新启动游戏时,都会占用越来越多的内存。我尝试用这个来代替:

[self.navigationController pushViewController:vc animated:YES];

但它只是给我一个空白屏幕。我什至尝试像这样弹出当前 Controller :

[self.navigationController popViewControllerAnimated:YES];

但是没有任何作用。我假设 self.navigationController 是 nil,但我不知道该怎么办。我不想在游戏场景中使用任何 UIButtons。我也更喜欢按原样使用游戏场景,而不需要在 Storyboard中重新创建它。

我知道那里有类似的问题,我已经阅读了其中的大部分,但没有一个对我有帮助。

感谢大家的帮助。

最佳答案

我花了太长时间才意识到这一点。我一直试图做的只是改变 Root View 。这段代码解决了我的问题:

UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
UIViewController * vc = [storyboard instantiateViewControllerWithIdentifier:@"GameView"];
vc.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
UIApplication.sharedApplication.delegate.window.rootViewController = vc;

关于ios - 如何在不使用 Storyboard的情况下以编程方式导航 Objective-C 应用程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56689691/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com