【问题标题】:How to dismiss/remove SKScene and View Controllers?如何关闭/删除 SKScene 和视图控制器?
【发布时间】:2014-09-06 04:03:50
【问题描述】:

我有 3 个视图控制器。 VC1(初始和主屏幕)、VC2(SKScene 和游戏)、VC3(UIViewController 和游戏结束屏幕)。我的问题是当我从 VC1 开始,然后转到 VC2,然后移动到 VC3,然后回到 VC1,它们都堆叠在一起,所以看起来像这样。 VC1 - VC2 - VC3 - VC1 - VC2 - VC3 - VC1 - VC2 - VC3 - VC1 - VC2 - VC3,所以最终内存增加,游戏速度急剧下降,最终崩溃。当我移动到 VC2 时,我需要以某种方式释放 VC1,然后在移动到 VC3 时释放 VC2,等等。每次我围绕 VC 进行循环时,我希望它们重新启动,就好像它们以前从未存在过一样。我将提供我如何在所有人之间转移的代码。顺便说一句,在 xcode5 中使用精灵套件。 VC = 视图控制器

VC1 内部:

   @implementation HomeScreen

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
    // Custom initialization
}
return self;
}

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}


- (IBAction)goToGame:(id)sender {

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *vc = [mainStoryboard instantiateViewControllerWithIdentifier:@"GameScreen"];
[self presentViewController:vc animated:YES completion:nil];


}  //This moves me to my VC2

VC2 内部:

@implementation ViewController



- (void)viewWillLayoutSubviews
{
[super viewWillLayoutSubviews];

  [[NSNotificationCenter defaultCenter] addObserver:self   selector:@selector(presentMyViewController) name:@"presentMyViewController" object:nil];

// Configure the view.
SKView * skView = (SKView *)self.view;
skView.showsFPS = YES;
skView.showsNodeCount = YES;


// Create and configure the scene.
SKScene * scene = [MyScene sceneWithSize:skView.bounds.size];
scene.scaleMode = SKSceneScaleModeAspectFill;

// Present the scene.
[skView presentScene:scene];
}


-(void)presentMyViewController
{
[self performSegueWithIdentifier:@"Segue" sender:nil];
}

连接到VC2的SKScene内部:

 @implementation
{
    int _lives;
   BOOL _gameOver;
}

- (void)update:(NSTimeInterval)currentTime
{
    if (_lives == 0 && !_gameOver) {

    _gameOver = YES;
    NSLog(@"You Lose!");
    [self presentVC3];
}

-(void)presentVC3
{
[[NSNotificationCenter defaultCenter] postNotificationName:@"presentMyViewController"   object:nil]; 
}// This moves me to my VC3

VC3 内部:

 @implementation ViewController3



- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
   self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
      if (self) {
    // Custom initialization
   }
  return self;
}

- (void)viewDidLoad {
{  
[super viewDidLoad];
// Do any additional setup after loading the view.
}

- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}



- (IBAction)goToHomeScreen:(id)sender {

UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
UIViewController *vc = [mainStoryboard    instantiateViewControllerWithIdentifier:@"HomeScreen"];        
  [self presentViewController:vc animated:YES completion:nil];


} // This move me back to VC1

VC1 是 UIViewController,VC2 是 ViewController,呈现的是我的实际游戏 SKScene,VC3 是 UIViewController。

所以只是重申一下。当我从 VC 移动到 VC 时,它们都相互重叠,增加了内存和 CPU,并降低了游戏的 FPS(每秒帧数),直到最终崩溃。我被告知我需要关闭我的 VC 或从内存中释放它们来解决这个问题,如果这是正确的解决方案,那么我该怎么做呢?如果您有正确的解决方案,请提供一些代码以提供帮助。任何帮助表示赞赏!

【问题讨论】:

  • 你为什么不用segues?
  • 因为我不熟悉它们,你能给我一些代码或例子吗? segues 会从记忆中消除 VC 吗?
  • 网络上有很多例子,如何使用segues。是的,您不必担心使用 segues 释放 VC
  • 我确信网上都有例子,但我正在寻找一个针对我的问题的例子,所以这就是我问这个问题的原因。因此,除非您可以提供一些代码/方法来帮助我,否则不要打扰。我来到这个网站问这个问题是因为我在网上找不到答案。我是编程新手,我正在尝试从我买的书中学习,所以自学是一种挑战,这就是为什么我需要一些实际的代码来帮助我开始。我很难从其他人的问题中应用,这就是为什么我要寻找针对我自己的解决方案。
  • 检查这个答案,它可以帮助你:stackoverflow.com/questions/21578391/…

标签: uiviewcontroller xcode5 sprite-kit viewcontroller skscene


【解决方案1】:

我很少使用 SK,但 SKView 是一个 UIView 子类,您可以将场景放入其中。也许您正在寻找的设计使用单个视图控制器,只是切换它的 SKView(或者它是 SKView 的场景)。

您使用的 presentVC... 逻辑本质上会堆叠 vcs,因此您将很难(不可能)一次只保留一个。如果必须更改 vcs,方法是在窗口的根视图控制器级别。

【讨论】:

  • 好的,谢谢。只是一个题外话的问题。您是否偶然知道如何将数据从一个 Viewcontroller 传递到另一个 Viewcontroller。在我的第二个视图控制器(SKScene)中,这是我的实际游戏,我有一个名为 score 的私有 int。好吧,当他们的游戏结束时,我希望能够将该 int 分数显示到第三个 VC 上。我怎样才能做到这一点?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-28
  • 2015-09-20
相关资源
最近更新 更多