微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SwiftUI 可扩展列表实现问题

如何解决SwiftUI 可扩展列表实现问题

我是在 Swift 中开发 iOS 应用程序的新手,对于我的第二个应用程序,我选择了待办事项列表。 我将 SwiftUI 与 CoreData 一起使用,以便在设备上存储应用程序的数据。 CoreData 存储一个实体,它是 ITEM,它有 titlefullDescriptiondaydate,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)
        }
    }
}

然后我的应用预览看起来像这样(当然没有类别应该是一周中的几天):

enter image description here

我会感谢你的帮助和你能给我的每一个建议,因为正如我所说,我不久前开始了我的 Swift 冒险。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。