簡體   English   中英

協調器不適用於 UIViewRepresentable?

[英]Coordinator is not working for UIViewRepresentable?

也許我不正確理解 UIViewRepresentable 但我認為這會起作用。

我正在嘗試使用兩個 UIViewRepresentable 類在 SwiftUI 中顯示我的 scnkit 場景。 我還為這些類使用了兩種協調器方法,各一種。 協調器可以訪問當前場景的渲染和物理世界方法。

玩家在第一個場景中生成,當與敵人接觸時,它會過渡到第二個場景。 這是問題開始的地方,它沒有讓第二個協調器處理第二個 class 的物理世界和渲染方法。

我相信這是因為即使場景發生變化,我仍在使用 swiftui 中的第一個 class 而不是第二個。 或者換句話說,我正在改變場景,但不是正在使用的 class。

問題:如何從第一個 class 過渡到第二個和/或從第一個場景到另一個場景,並且仍然讓每個場景的協調器處於活動狀態。

這是第一個 Class。

struct FirstClass : UIViewRepresentable {

    var view = SCNView()
    var scene = SCNScene(named: "First.scn")!

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    func makeUIView(context: Context) -> SCNView {
        scene.physicsWorld.contactDelegate = context.coordinator
        view.delegate = context.coordinator
        return view
    }

    ...

    /// Transitions into the second scene.
    func changeScenes() {
        controlManager.jumped = false
        let transition = SKTransition.fade(with: .black, duration: 0.5)
        let secondClass = SecondClass()
         view.present(secondClass.scene, with: transition, incomingPointOfView: nil)
    }
}

這是第二個 Class

struct SecondClass : UIViewRepresentable {

    var view = SCNView()
    var scene = SCNScene(named: "Second.scn")!

    func makeCoordinator() -> SecondCoordinator {
        SecondCoordinator(self)
    }

    func makeUIView(context: Context) -> SCNView {
        scene.physicsWorld.contactDelegate = context.coordinator
        view.delegate = context.coordinator
        return view
    }
}

這是 SwiftUI Class

struct Game: View {

    var view = FirstClass()

    var body: some View {
        ZStack {
            view
            
            ...
        }
    }
}

這部分let secondClass = SecondClass()不起作用,因為 SwiftUI 不知道SecondClass的實例,以便正確管理其生命周期。 此外,您似乎沒有使用SecondClass結構的view屬性(順便說一句,結構的有趣名稱:))

一種解決方案是在同一個UIViewRepresentable中管理兩個場景,基本上將生命周期管理保持在同一側。

struct MyScene : UIViewRepresentable {

    var view = SCNView()
    var firstScene = SCNScene(named: "First.scn")!
    lazy var secondScene = SCNScene(named: "Second.scn")!

    ...

    /// Transitions into the second scene.
    func changeScenes() {
        controlManager.jumped = false
        let transition = SKTransition.fade(with: .black, duration: 0.5)
        view.present(secondScene, with: transition, incomingPointOfView: nil)
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM