我正在与CoreData
和SwiftUI
合作。
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
}
}