故事板只加载一次

时间:2016-09-09 22:58:16

标签: ios swift sprite-kit

说明

我试图在单独的swift文件中构建一个简单的电子邮件代码(在这种情况下:GameViewController.swiftMailViewController.swift)。

会发生什么:我必须触摸GameViewController中的屏幕才能拨打MailViewController,取消或发送电子邮件时,它会返回{{1} }。

正在发生的事情:调用GameViewController并在触摸MailViewControllerCancel时返回,但仅触及。当我再次尝试(即使再次关闭并打开应用程序)时,尝试返回Send时会出现黑屏。

代码

您可以点击here

下载以下代码

GameViewController

GameViewController

MailViewController

import UIKit
import SpriteKit

class GameViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Set view size.
        let scene = GameScene(size: view.bounds.size)

        // Configure the view.
        let skView = view as! SKView
        skView.showsFPS = true
        skView.showsNodeCount = true

        /* Sprite Kit applies additional optimizations to improve rendering performance */
        skView.ignoresSiblingOrder = true

        /* Set the scale mode to scale to fit the window */
        scene.scaleMode = .ResizeFill

        skView.presentScene(scene)

        //Register mail observer (so I can call from GameScene)
        NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.openMailViewController), name: "openMailViewController", object: nil)
    }

    override func supportedInterfaceOrientations() -> UIInterfaceOrientationMask {
        if UIDevice.currentDevice().userInterfaceIdiom == .Phone {
            return .Landscape
        } else {
            return .Landscape
        }
    }
}

extension GameViewController{

    func openMailViewController(){
        self.performSegueWithIdentifier("openMailViewController", sender: self)
    }
}

Main.storyboard

enter image description here


提前谢谢,
路易斯。

2 个答案:

答案 0 :(得分:1)

尝试将故事板中的反向segue从MailViewController移至GameViewController。 在MailViewController中,使用此功能返回:

func backToGameViewController(){
    dismissViewControllerAnimated(true, completion: nil)
}

将功能更改为以下内容:

func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) {

        //dismiss mail
        self.dismissViewControllerAnimated(true) {
            //go back to the game
            self.backToGameViewController()
        }

    }

也可以在您的设备上试用,而不是在模拟器上试试。尝试打开MFMailComposeViewController时,模拟器会返回错误。

segue创建一个新对象,并将其推送到堆栈上,您不希望在彼此之上创建重复的对象堆栈。

希望这有帮助。

答案 1 :(得分:1)

如果您更换

self.performSegueWithIdentifier("backToGameViewController", sender: self)

self.dismissViewControllerAnimated(true, completion: nil)

你的代码会起作用,但我认为它实际上并不是你想做的。

这个工作的原因是你的游戏控制器你正在呈现MailViewController,然后呈现一个MFMailComposeViewController。由于您一次呈现两个,因此在邮件视图向上滑动之前,您会看到一个奇怪的双重动画,其中空白视图会向上滑动。为了完全解除邮件视图,你需要两次调用dismissViewController。

更好的方法是直接从GameController呈现MFMailComposeController。