【问题标题】:Is there a way to dismiss a SwiftUI view from within a SpriteView scene?有没有办法从 SpriteView 场景中关闭 SwiftUI 视图?
【发布时间】:2020-07-21 10:56:52
【问题描述】:

我的场景是这样呈现的

struct GameView: View {
    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
    
    func scene(size:CGSize) -> SKScene {
        let scene = GameScene()
        scene.size = size
        scene.scaleMode = .fill
        scene.physicsWorld.gravity = CGVector.zero
        return scene
    }
    
    var body: some View {
        GeometryReader { geometry in
            if #available(iOS 14.0, *) {
                SpriteView(scene: self.scene(size:geometry.size))
                    .edgesIgnoringSafeArea(.all)
            } else {
                // Fallback on earlier versions
                Text("Game Only available from iOS 14")
            }
        }
        .navigationTitle("")
        .navigationBarHidden(true)
    }
}

在其他非 spriteKit 视图中,我使用 self.presentationMode.wrappedValue.dismiss() 导航回上一页。一旦从场景中触发游戏结束,在这种情况下我可以做类似的事情吗? (所有视图都在一个导航视图中)

【问题讨论】:

  • 您需要来自SpriteView 的回调。你会显示SpriteView 代码吗?

标签: swift swiftui ios-navigationview


【解决方案1】:

有点。我认为目前您无法做到这一点,但我为我的游戏所做的(我不确定这是否是良好的编码习惯)正在使用 ViewManager。

ViewManager 所做的是通过包含一个或多个视图的布尔值将某些视图设置为隐藏或可见。 bool 值在场景中发生变化,并反映到 swiftui。

这是一个例子:

class ViewManager: ObervableObject {

    @Published private var exitView = false

    public static var shared = ViewManager()

    privat init() { }
}

class level: SKScene {
    /*Game Code*/
    override func update(_ currenTime: Interval) {
        if /*end level condition*/ {
            ViewManager.shared.exitView = true
        }
    }
}

struct GameView: View {
    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
    @StateObject private var viewManager = ViewManager.shared

    /*your code here*/

    var body: some View {
        ZStack {
            /*SpriteView*/
            if viewManager.exitView {
                Button {
                    presentationMode.wrappedValue.dismiss()
                    viewManager.exitView = false
                } label: {
                    Image(systemName: "arrow.uturn.left")
                }
            }
        }
    }
}

ViewManager 更像是一种解决方法,它有很大帮助。

【讨论】:

    猜你喜欢
    • 2020-09-27
    • 2021-08-08
    • 1970-01-01
    • 2015-01-27
    • 1970-01-01
    • 2021-08-01
    • 2020-12-03
    • 2022-01-20
    • 1970-01-01
    相关资源
    最近更新 更多