SwiftUI 在数据更改时处理 SpriteKit 场景重建
SwiftUI handling SpriteKit scene recreation when data changes
我有一个连接到 CoreData
模型的 SwiftUI
视图。我还有一个 SpriteKit
场景可以更改模型中的数据。因此,每次我在 CoreData 中从我的 SKScene 操作我的数据时,我的场景都会重新初始化,这在我的情况下是一种不需要的行为。
如何在不重新创建 SKScene
的情况下在 SpriteView
中获取更新后的模型?
我的代码如下所示:
struct TamagotchiListView: View {
@Environment(\.managedObjectContext)
var context: NSManagedObjectContext
@FetchRequest(fetchRequest: TamagotchiModel.getFetchRequest())
var tamagotchis: FetchedResults<TamagotchiModel>
var body: some View {
VStack {
List {
ForEach(tamagotchis, id: \.self) { (tamagotchi: TamagotchiModel) in
NavigationLink(destination: SpriteKitView(scene: SpriteKitScene(model: tamagotchi))) {
HStack {
Image(systemName: "gamecontroller")
.padding(.trailing, 5)
VStack(alignment: .leading) {
Text(tamagotchi.name)
.font(.headline)
Spacer()
Text(tamagotchi.birthDate, style: .date)
}
Spacer()
}
}
}
}
}
}
我设法通过创建一个视图模型来解决我的问题,该视图模型在需要时管理 SpriteKit 场景创建。
class TamagotchiViewModel {
private var spriteKitScenes: [SpriteKitScene] = []
func scene(for tamagotchi: TamagotchiModel) -> SpriteKitScene {
if let scene = spriteKitScenes.first(where: { [=10=].tamagotchi?.tamagotchiModel.id == tamagotchi.id}) {
return scene
} else {
let newScene = SpriteKitScene(model: tamagotchi)
spriteKitScenes.append(newScene)
return newScene
}
}
}
我有一个连接到 CoreData
模型的 SwiftUI
视图。我还有一个 SpriteKit
场景可以更改模型中的数据。因此,每次我在 CoreData 中从我的 SKScene 操作我的数据时,我的场景都会重新初始化,这在我的情况下是一种不需要的行为。
如何在不重新创建 SKScene
的情况下在 SpriteView
中获取更新后的模型?
我的代码如下所示:
struct TamagotchiListView: View {
@Environment(\.managedObjectContext)
var context: NSManagedObjectContext
@FetchRequest(fetchRequest: TamagotchiModel.getFetchRequest())
var tamagotchis: FetchedResults<TamagotchiModel>
var body: some View {
VStack {
List {
ForEach(tamagotchis, id: \.self) { (tamagotchi: TamagotchiModel) in
NavigationLink(destination: SpriteKitView(scene: SpriteKitScene(model: tamagotchi))) {
HStack {
Image(systemName: "gamecontroller")
.padding(.trailing, 5)
VStack(alignment: .leading) {
Text(tamagotchi.name)
.font(.headline)
Spacer()
Text(tamagotchi.birthDate, style: .date)
}
Spacer()
}
}
}
}
}
}
我设法通过创建一个视图模型来解决我的问题,该视图模型在需要时管理 SpriteKit 场景创建。
class TamagotchiViewModel {
private var spriteKitScenes: [SpriteKitScene] = []
func scene(for tamagotchi: TamagotchiModel) -> SpriteKitScene {
if let scene = spriteKitScenes.first(where: { [=10=].tamagotchi?.tamagotchiModel.id == tamagotchi.id}) {
return scene
} else {
let newScene = SpriteKitScene(model: tamagotchi)
spriteKitScenes.append(newScene)
return newScene
}
}
}