【问题标题】:SwiftUI: How to show/edit an int from CoreData without being in a List?SwiftUI:如何显示/编辑 CoreData 中的 int 而不在列表中?
【发布时间】:2022-01-19 07:16:47
【问题描述】:

这里是自学初学者。我试图在 ContentView 的 VStack 中显示来自核心数据的 Int,而不是在列表中。但实际上,我能找到的所有关于 Core Data 的教程(跟踪书籍、电影、订单、学生)都使用 List 来显示包含 Int 的数组。单独显示 Int 没有任何意义。

Xcode 可以毫无问题地构建 countnum.countnum +=1。在我看来,它读得很好。但是一旦我尝试展示它,它就不起作用了。我在这里毁了我的大脑。

struct ContentView: View {
    @Environment(\.managedObjectContext) var moc
    @FetchRequest(sortDescriptors: []) var countnum: FetchedResults<CountNum>
    
    var body: some View {
//        let countnum = CountNum(context: moc)
        VStack{
            Text("+")
                .padding()
                .onTapGesture (count: 2){
                    let countnum = CountNum(context: moc)
                    countnum.countnum += 1
                }
            Text("\(countnum)") //No exact matches in call to instance method 'appendInterpolation'
        }
        
        
    }
}

谢谢

【问题讨论】:

  • 看表here
  • @loremipsum 谢谢你的回答。但我必须诚实。那里的代码看起来远远高于我目前(几乎不存在)阅读代码的能力。
  • @loremipsum 如果我尽力理解它。 .sheet 有一个动作 $vm.newItem 。你是说我需要在我的实体中添加一个项目吗?
  • @Published var newItem: Item? = nil!=nil 时不会触发sheet(item)Buttonvm.addItem(moc: viewContext) 创建一个新对象,然后将该对象放在newItem 上。工作表随即打开,其中包含新对象。 Item 只是一个新 Xcode 项目附带的示例实体。您可以获取该代码并将其粘贴到一个中,以便查看它是如何工作的。

标签: core-data swiftui


【解决方案1】:

....all the tutorials ... show an array containing an Int.是的,那是因为CoreData 可以包含许多“对象”。当你得到一个 CountNum 对象数组时 你做你的.....var countnum: FetchedResults&lt;CountNum&gt;。所以你需要决定你想要哪个CountNum 利用。例如,如果你想使用第一个,那么:

struct ContentView: View {
    @Environment(\.managedObjectContext) var moc
    @FetchRequest(sortDescriptors: []) var countnum: FetchedResults<CountNum>
    
    var body: some View {
        VStack {
            if let firstItem = countnum.first {
                Text("+")
                    .padding()
                    .onTapGesture(count: 2) {
                        firstItem.countnum += 1
                        do {
                            try moc.save()
                        } catch {
                            print(error)
                        }
                    }
                Text("\(firstItem.countnum)").foregroundColor(.green)
            }
        } 
    }
}

EDIT-1:在add 按钮的CoreData 示例代码中添加新的CountNum。

struct ContentView: View {
    @Environment(\.managedObjectContext) var moc
    @FetchRequest(sortDescriptors: []) var countnum: FetchedResults<CountNum>
    
    var body: some View {
        Button(action: {add()}) { Text("add new CountNum").foregroundColor(.green) }
        .padding(.top, 50)
        List {
            ForEach(countnum) { item in
                HStack {
                    Text("++")
                        .onTapGesture(count: 2) { increment(item) }
                    Text("\(item.countnum)").foregroundColor(.blue)
                    Text("delete").foregroundColor(.red)
                        .onTapGesture { delete(item: item) }
                }
            }
        }
    }
    
    func increment(_ item: CountNum) {
        item.countnum += 1
        save()
    }
    
    func add() {
        let countnum = CountNum(context: moc)
        countnum.countnum = 0
        save()
    }
    
    func delete(item: CountNum) {
        moc.delete(item)
        save()
    }
    
    func save() {
        do { try moc.save() } catch { print(error) }
    }
    
}

【讨论】:

  • 非常感谢。这正是我的想法。只有一个int。代码在我运行时有效。但由于某种原因,模拟器上除了一张白纸之外什么都没有显示。有什么快速的想法吗? imgur.com/a/eKiw60P
  • 是的,这可能是因为您的 CoreData 中没有任何数据。您可以在我更新的答案中使用 EDIT-1 代码轻松添加一些内容。如果这回答了您的问题,请考虑将我的答案标记为正确,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多