如何解决SwiftUI 可扩展列表实现问题
我是在 Swift 中开发 iOS 应用程序的新手,对于我的第二个应用程序,我选择了待办事项列表。 我将 SwiftUI 与 CoreData 一起使用,以便在设备上存储应用程序的数据。 CoreData 存储一个实体,它是 ITEM,它有 title、fullDescription、day、date,finished 属性。我想在可扩展列表中展示我的所有项目(任务),其中列表类别是一周中的几天。
现在一切都在一个文件 ContentView 中,但稍后我将为整个项目制作 MVVM。
我的 body var 定义旁边出现以下错误:
未能产生表达诊断;请提交错误报告 (https://swift.org/contributing/#reporting-bugs) 并包含项目
这根本无法帮助我确定问题。
我的 ContentView 文件:
import SwiftUI
import CoreData
let daysOfTheWeek = ["Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"]
let daterange: ClosedRange<Date> = {
let calendar = Calendar.current
let startComponents = DateComponents(year: 2021,month: 1,day: 1)
let endComponents = DateComponents(year: 2021,month: 12,day: 31,hour: 23,minute: 59,second: 59)
return calendar.date(from:startComponents)!
...
calendar.date(from:endComponents)!
}()
struct ContentView: View {
@Environment(\.managedobjectContext) private var viewContext
@AppStorage("isDarkMode") private var darkMode = false
@State var showAddFormView = false
@FetchRequest(
sortDescriptors: [NSSortDescriptor(keyPath: \Item.title,ascending: true)],animation: .default)
private var items: FetchedResults<Item>
var body: some View {
GeometryReader { geometry in
let screenWidth = geometry.size.width
let screenHeight = geometry.size.height
let categories = groupItems()
if showAddFormView {
AddTaskView()
} else {
vstack {
TopView()
.frame(width: screenWidth,height: screenHeight * 0.1)
.padding(.top,screenHeight * 0.025)
NavigationView {
List(categories,children: \.items) { row in
ForEach(row.items!) { item in
NavigationLink(destination: DetailView(newItem: item)) {
HStack {
Text("\(item.title!)")
.font(.system(size: screenWidth * 0.05))
.frame(width: screenWidth * 0.6,height: screenHeight * 0.04,alignment: .leading)
if item.finished == true {
Circle().foregroundColor(.green)
.frame(width: screenWidth * 0.2,height: screenHeight * 0.035)
} else {
Circle().foregroundColor(.red)
.frame(width: screenWidth * 0.2,height: screenHeight * 0.035)
}
}
}
.frame(width: screenWidth * 0.9,height: screenHeight * 0.055,alignment: .center)
}
.onDelete(perform: deleteItems)
}
.navigationBarHidden(true)
}
ZStack {
RoundedRectangle(cornerRadius: 25,style: .continuous)
.fill(Color.blue)
.frame(width: screenWidth * 0.3,height: screenHeight * 0.05)
Button(action: { showAddFormView = true }) {
Label("Add Task",systemImage: "plus")
.foregroundColor(.white)
}
}
}
.preferredColorScheme(darkMode ? .dark : .light)
.environment(\.colorScheme,darkMode ? .dark : .light)
}
}
}
struct Category: Identifiable {
let id = UUID()
let name: String
let items: [Item]?
}
private func groupItems() -> [Category] {
var categories: [Category] = []
var itemsForEachCategory: [Item] = []
for day in daysOfTheWeek {
for item in items {
if item.day! == daysOfTheWeek[0] {
itemsForEachCategory.append(item)
}
}
categories.append(Category(name: day,items: itemsForEachCategory))
}
return categories
}
private func saveContext() {
do {
try viewContext.save()
} catch {
let nsError = error as NSError
fatalError("Unresolved error \(nsError),\(nsError.userInfo)")
}
}
private func deleteItems(offsets: IndexSet) {
withAnimation {
offsets.map { items[$0] }.forEach(viewContext.delete)
saveContext()
}
}
}
当我不使用可扩展列表并且 ContentView 中的 body var 看起来像这样时,问题就会消失:
var body: some View {
GeometryReader { geometry in
let screenWidth = geometry.size.width
let screenHeight = geometry.size.height
let categories = groupItems()
if showAddFormView {
AddTaskView()
} else {
vstack {
TopView()
.frame(width: screenWidth,screenHeight * 0.025)
NavigationView {
List {
ForEach(items) { item in
NavigationLink(destination: DetailView(newItem: item)) {
HStack {
Text("\(item.title!)")
.font(.system(size: screenWidth * 0.05))
.frame(width: screenWidth * 0.6,darkMode ? .dark : .light)
}
}
}
然后我的应用预览看起来像这样(当然没有类别应该是一周中的几天):
我会感谢你的帮助和你能给我的每一个建议,因为正如我所说,我不久前开始了我的 Swift 冒险。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。