【问题标题】:Transitioning ViewControllers转换视图控制器
【发布时间】:2014-12-15 18:41:43
【问题描述】:

我正在使用当前有两个视图控制器的 Swift 在 SpriteKit 中制作游戏。第一个 viewController 是 GameViewController,它使用情节提要在界面构建器中显示带有一些按钮的菜单。菜单上有一个播放按钮,可以转换到显示 gameScene 的第二个 viewController。两个 viewController 都加载一个 SKScene。

要从一个视图控制器转换到另一个并返回,我使用的是在情节提要中创建的 segues。

我遇到的问题是,当我在视图控制器之间切换时内存会增加,导致应用程序最终崩溃。我有一种感觉 viewControllers 只是相互堆叠。这是我的 GameViewController 和 GameSceneViewController 代码。

游戏视图控制器:

class GameViewController: UIViewController, GKGameCenterControllerDelegate {

//MARK: Variables
var scene: Menu!
@IBOutlet weak var settingsBtn: UIButton!
@IBOutlet weak var leaderboardsBtn: UIButton!
@IBOutlet weak var storeBtn: UIButton!
@IBOutlet weak var playBtn: UIButton!

@IBAction func play(sender: UIButton) {


}

//MARK: Button Animations

func menuButtonAnimations(){

    settingsBtn.transform = CGAffineTransformMakeTranslation(0, 200)
    leaderboardsBtn.transform = CGAffineTransformMakeTranslation(0, 200)
    storeBtn.transform = CGAffineTransformMakeTranslation(0, 200)

    springWithDelay(0.5, 0.7, {
        self.settingsBtn.transform = CGAffineTransformMakeTranslation(0, 0)
    })
    springWithDelay(0.5, 0.75, {
        self.leaderboardsBtn.transform = CGAffineTransformMakeTranslation(0, 0)
    })
    springWithDelay(0.5, 0.8, {
        self.storeBtn.transform = CGAffineTransformMakeTranslation(0, 0)
    })

}

//MARK: The View
override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)

    // Configure the view.
    let skView = self.view as SKView
    skView.showsFPS = false
    skView.showsNodeCount = false
    skView.showsPhysics = false

    skView.ignoresSiblingOrder = true

    scene = Menu(size: skView.bounds.size)
    scene.scaleMode = .AspectFill

    skView.presentScene(scene)

    //Button Animation
    menuButtonAnimations()

}

//MARK: Extra Stuff
override func shouldAutorotate() -> Bool {
    return true
}

override func supportedInterfaceOrientations() -> Int {
    if UIDevice.currentDevice().userInterfaceIdiom == .Phone {
        return Int(UIInterfaceOrientationMask.AllButUpsideDown.rawValue)
    } else {
        return Int(UIInterfaceOrientationMask.All.rawValue)
    }
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Release any cached data, images, etc that aren't in use.
}

override func prefersStatusBarHidden() -> Bool {
    return true
}
}

GameSceneViewController:

class GameSceneViewController: UIViewController{

    //MARK: Variables

    @IBOutlet weak var returnBtn: UIButton!

    //MARK: Helper Functions

    //MARK: The View
    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)

        // Configure the view.
        var scene: GameScene!
        let skView = self.view as SKView
        skView.showsFPS = false
        skView.showsNodeCount = false
        skView.showsPhysics = false

        skView.ignoresSiblingOrder = true

        scene = GameScene(size: skView.bounds.size)
        scene.scaleMode = .AspectFill

        skView.presentScene(scene)

        //Notifications
    }

转场都是使用故事板中的链接创建的模态转场。

任何关于如何在不不断增加内存的情况下在两个视图控制器之间来回转换的帮助都会很棒!

【问题讨论】:

    标签: ios swift uiviewcontroller sprite-kit


    【解决方案1】:

    如果一个视图控制器通过模态 segue 呈现另一个视图控制器,您应该使用 dismissViewControllerAnimated:completion: 返回第一个而不是堆叠模态呈现。

    【讨论】:

    • 这取决于发生了什么让你想回到第一个控制器。如果你有一个连接到 segue 的按钮,给它一个方法而不是调用“dismiss”。
    【解决方案2】:

    我相信您可以将其作为 IBAction 来关闭模式视图:

    目标-C:

    [self dismissViewControllerAnimated:YES completion:nil];
    

    斯威夫特:

    self.dismissViewControllerAnimated(true, completion: nil)

    (Dismiss Modal View)

    而且我相信后退按钮可以从包含的 NSViewController 链接到 dismissController: 以关闭模式视图(至少对于 Cocoa 故事板,无论如何)。

    【讨论】:

      猜你喜欢
      • 2021-03-13
      • 1970-01-01
      • 1970-01-01
      • 2018-11-27
      • 2013-03-22
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      • 1970-01-01
      相关资源
      最近更新 更多