我试图在单独的swift文件中构建一个简单的电子邮件代码(在这种情况下:GameViewController.swift
和MailViewController.swift
)。
会发生什么:我必须触摸GameViewController
中的屏幕才能拨打MailViewController
,取消或发送电子邮件时,它会返回{{1} }。
正在发生的事情:调用GameViewController
并在触摸MailViewController
或Cancel
时返回,但仅触及。当我再次尝试(即使再次关闭并打开应用程序)时,尝试返回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
提前谢谢,
路易斯。
答案 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。