ios - 具有不同方向的多个 View Controller

标签 ios swift

解释

我有一个横屏运行的游戏,我正在尝试以竖屏模式发送电子邮件。

基本上:

  • 如果实际 View 是GameViewController = .Landscape;
  • 如果实际 View 是 MailViewController = .AllButUpsideDown

演示代码

我在下面构建了这段代码,但遇到了问题:

  • 触摸屏幕时未调用邮件。


您可以下载此代码 here .

游戏场景

import SpriteKit

class GameScene: SKScene {

    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        /* Called when a touch begins */

        //Mail
        NSNotificationCenter.defaultCenter().postNotificationName("openMail", object: nil)

    }
}

游戏 View Controller

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)
    }

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

邮件 View Controller

import UIKit
import SpriteKit
import MessageUI

class MailViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

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

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

//Mail
extension MailViewController: MFMailComposeViewControllerDelegate {

    func openMailController() {

        let mailComposerVC = MFMailComposeViewController()
        mailComposerVC.mailComposeDelegate = self //extremely important to set the mailComposeDelegate property, not the delegate property

        self.presentViewController(mailComposerVC, animated: true, completion: nil)
    }

    func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) {
        self.dismissViewControllerAnimated(true, completion: nil)
    }
}


感谢您的帮助,
路易斯。

最佳答案

您提供的代码存在问题,即未调用 MailViewController 类 View 中的观察者加载方法。因此 Observer 未设置为接收任何通知。

此外,您没有在代码中的任何地方调用 segue 来调用 MailViewController。

解决方案:使用委托(delegate)方法

GameScene 类已更新:

    import SpriteKit

    // Protocol 
    protocol  gameSceneDelegate  {
        func openMail()
    }

    // Protocol 


    class GameScene: SKScene {

        // Delegate
        var sceneDelegate : gameSceneDelegate?

        override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
            /* Called when a touch begins */

            //Mail
    //        NSNotificationCenter.defaultCenter().postNotificationName("openMail", object: nil)

            // delegate method called on receiving touches
            self.sceneDelegate?.openMail()

        }
    }

GameViewController 类已更新:

    import UIKit
    import SpriteKit

    class GameViewController: UIViewController {

        override func viewDidLoad() {
            super.viewDidLoad()

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

            // Delegate Confirmation

            scene.sceneDelegate = self

            // 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)
        }

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

    // Delegate Method Implementation

    extension GameViewController : gameSceneDelegate{
        func openMail(){
            self.performSegueWithIdentifier("openMail", sender: self);
        }
    }

邮件 View Controller :

    import UIKit
    import SpriteKit
    import MessageUI

    class MailViewController: UIViewController {

        override func viewDidLoad() {
            super.viewDidLoad()

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

            self.openMailController()
        }

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

    //Mail
    extension MailViewController: MFMailComposeViewControllerDelegate {

        func openMailController() {

            let mailComposerVC = MFMailComposeViewController()
            mailComposerVC.mailComposeDelegate = self //extremely important to set the mailComposeDelegate property, not the delegate property

            self.presentViewController(mailComposerVC, animated: true, completion: nil)
        }

        func mailComposeController(controller: MFMailComposeViewController, didFinishWithResult result: MFMailComposeResult, error: NSError?) {
            self.dismissViewControllerAnimated(true, completion: nil)
        }
    }

Storyboard的最后更改:

单击 segue 连接 GameViewController 和 MailViewController 并将标识符更改为 - openMail 或您想要保留的任何内容

关于ios - 具有不同方向的多个 View Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38945623/

相关文章:

ios - 数组索引超出范围 Query 和 CollectionCell

ios - UITableView 单元格自动布局约束

ios - Xcode 模拟尺寸指标 - Freeform 和 None 设置之间的区别

objective-c - 在 Objective-C 中子类化时更改变量的类

ios - 在 iOS 8 上获取键盘大小不适用于外部键盘

swift - 如何从复杂的字典中获取值?

ios - 应用程序传输安全: NSURLSession/NSURLConnection HTTP load failed

swift - 如何使用 ARC 在 Swift 中手动保留?

swift - 如何在 Swift 中将元素追加到字典中?

iphone - 没有音频硬件可用时调用 AudioUnitInitialize()