Swift PreviewProvider 无法初始化视图变量

问题描述 投票:0回答:1

我在 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 很陌生,这是我的第一个项目,所以如果答案是显而易见的,我深表歉意。如果有任何反馈,我将不胜感激。谢谢!

swift swiftui core-data
1个回答
1
投票

尝试改变

let result = PersistenceController(inMemory: true)

let result = PersistenceController.preview

另外,你应该有类似的东西

session.addToClimbs(climbOne)

并改变

var session: Session

@ObservedObject var session: Session
© www.soinside.com 2019 - 2024. All rights reserved.