首页 > 解决方案 > 如何:让 SKScene 访问dismiss() UIKit 方法

问题描述

是否可以在 SKScene 类中访问dismiss()?Dismiss 是 apples UIKit 提供的一种方法,这里是 Apple 关于dismiss的官方文档的链接。

class GameScene: SKScene {

}

尝试从 IBAction 示例中触发解雇:

    @IBAction func dismissTapped(_ sender: Any) {
     //figure out how to dismiss
    }

解雇通常会像这样使用 -

dismiss(animated: true, completion: nil)

标签: iosswiftuikit

解决方案


dismiss是 UIviewController 上的方法,而不是 SKScene 上的方法。但是,您的场景确实有一个view属性是它的包含视图(它是 a SKView,它是 a UIView,它是 a UIResponder)。您可以使用next继承自的视图方法UIResponder沿着响应者链向上走,直到您点击第一个视图控制器(因为UIViewController也是 a UIResponder):

extension UIResponder {
    func firstParent<T: UIResponder>(ofType type: T.Type ) -> T? {
        return next as? T ?? next.flatMap { $0.firstParent(ofType: type) }
    }
}
//Use in your SKScene like so
view?.firstParent(ofType: UIViewController.self)?.dismiss(animated: true, completion: nil)

推荐阅读