我在 SwiftUI 项目中使用 CoreData,关系如下:
Climb:
- timestamp: Date
- grade: Int16
- attempts: Int16
...
Session:
- timestamp: Date
- climbs: [Climb] # A list of Climb objects
我的第一个视图显示了过去的所有会话,当您单击一个会话时,我希望它转到不同的视图以显示该会话中的所有攀登。我的问题是,使用
climbs
时,我无法在新视图中正确引用 PreviewProvider
变量。
根据其他 StackOverflow 问题和 this 文档,我添加了
extension Session {
public var climbArray: [Climb] {
let set = climbs as? Set<Climb> ?? []
return set.sorted {
$0.timestamp! < $1.timestamp!
}
}
}
到我的 Session 对象,但是当尝试在视图中引用
climbArray
时,大小始终为零。这是 MVP 示例:
import SwiftUI
struct SessionDetailView: View {
var session: Session
var body: some View {
NavigationView {
Text("Length \(session.climbArray.count)")
}
}
}
struct SessionDetailView_Previews: PreviewProvider {
static var previews: some View {
SessionDetailView(session: {
let result = PersistenceController(inMemory: true)
let viewContext = result.container.viewContext
let climbOne: Climb = Climb(context: viewContext)
climbOne.grade = 2
climbOne.attempts = 1
climbOne.sent = true
climbOne.timestamp = Date()
let climbTwo: Climb = Climb(context: viewContext)
climbTwo.grade = 5
climbTwo.attempts = 4
climbTwo.sent = true
climbTwo.timestamp = Date()
let session: Session = Session(context: viewContext)
session.climbs = [climbOne, climbTwo]
return session
}())
.environment(\.managedObjectContext, PersistenceController.preview.container.viewContext)
}
}
无论我尝试什么,
Text("Length \(session.climbArray.count)")
总是最终显示Length 0
,因此永远不会生成攀爬列表。
我对 Swift 很陌生,这是我的第一个项目,所以如果答案是显而易见的,我深表歉意。如果有任何反馈,我将不胜感激。谢谢!
尝试改变
let result = PersistenceController(inMemory: true)
至
let result = PersistenceController.preview
另外,你应该有类似的东西
session.addToClimbs(climbOne)
并改变
var session: Session
至
@ObservedObject var session: Session