核心数据SwiftUI预览



我正在与CoreDataSwiftUI合作。

CoreData中存在一个名为Task的实体。

在父视图中,我对所有任务进行排序:

父视图:

@Environment(.managedObjectContext) private var viewContext
@FetchRequest(sortDescriptors: [])
private var tasks: FetchedResults<Task>
....
ForEach (tasks) {task in
if !task.isFinished {
HStack {
Text(task.name ?? "Untitled")
Spacer()
Text(String(task.countPomidorsActual))
Button(">", action: {
if timerManager.timerMode == .initial {
tabSelection = "TimerView"
workingTask.workingTask.task = task
} else {
presentWorkingTimerAlert.toggle()
}
})
.frame(width: 30, height: 30)
.buttonStyle(BorderlessButtonStyle())
}
}
}
.....

如果用户选择了以下任务之一,我将此任务分配给一个新类:

struct TaskInWork {
var task: Task
}
class WorkingTask: ObservableObject {
@Published var workingTask = TaskInWork(task: Task())
}

在子视图中,我需要取这个传入任务的名称,所以:

@Binding var task: Task
....
Text(task.name ?? "Name is empty")

但是预览有一个问题:

struct TimerView_Previews: PreviewProvider {

static var previews: some View {

let context = PersistenceContainer.shared.container.viewContext

let newTask = Task(context: context)

newTask.name = "Name for test preview"

TimerView(task: .constant(newTask))
.environment(.managedObjectContext, context)
}
}

导致错误

Type '()' cannot conform to 'View'; only struct/enum/class types can conform to protocols

如何制作一个带有"test preview"名称的预览?

使用return关键字返回计时器视图。因为静态var预览需要视图返回类型,并且你已经在var中添加了一些逻辑部分,所以你需要显式地编写返回关键字。

struct TimerView_Previews: PreviewProvider {

static var previews: some View {

let context = PersistenceContainer.shared.container.viewContext

let newTask = Task(context: context)

newTask.name = "Name for test preview"

return TimerView(task: .constant(newTask))
.environment(.managedObjectContext, context) //<--Here
}
}

最新更新