SwiftUI如何在macOS上使CoreData列表可选择和双击

SwiftUI如何在macOS上使CoreData列表可选择和双击,macos,core-data,swiftui,Macos,Core Data,Swiftui,我有一个可选择和双击的姓名列表。 我有一个CoreData记录列表,无法选择或双击 如何使CoreData列表可选择和双击 以下是我正在使用的可选列表代码: import SwiftUI struct ContentView: View { private static let values = ["Luke","Han","Chewie","Liea","R2D2"]

我有一个可选择和双击的姓名列表。 我有一个CoreData记录列表,无法选择或双击

如何使CoreData列表可选择和双击

以下是我正在使用的可选列表代码:

import SwiftUI

struct ContentView: View {
    private static let values = ["Luke","Han","Chewie","Liea","R2D2"]
    
    @State private var selection: String? = nil
    
    var body: some View {
        VStack {
            HStack {
                List(Self.values, id: \.self, selection: $selection) { name in
                    Text(name)
                        .gesture(TapGesture(count: 2).onEnded {
                            print("double clicked")
                            selection = name
                        })
                        .simultaneousGesture(TapGesture().onEnded {
                            print("single clicked")
                            selection = name
                        })
                }
            }
        }
    }
}
这是我的ManagedObject:

@objc(Enquiry)
public class Enquiry: NSManagedObject {

}
以下是显示列表的我的CoreData列表:

import SwiftUI
import CoreData

struct EnquiryList: View
{
    @Environment(\.managedObjectContext) private var viewContext
    
    var enquiries: FetchRequest<Enquiry>
    
    init (uuid: UUID)
    {
        enquiries = FetchRequest<Enquiry>(entity: Enquiry.entity(), sortDescriptors: [], predicate: NSPredicate(format: "UUID == %@", uuid as CVarArg))
    }
    @State private var selection: Enquiry? = nil
    
    var body: some View
    {
        VStack
        {
            ForEach(enquiries, id: \.self, selection: $selection)
            {enquiry in
                EnquiryListRow(enquiry: enquiry)
                    .gesture(TapGesture(count: 2).onEnded {
                        print("double clicked")
                        selection = enquiry
                    })
            }
        }
    }
}

inquiries.wrappedValue.count显示有三条记录,但不显示任何内容。将其移回ForEach将显示Hello三次。

在第二种情况下,您也应该使用List-
ForEach
只是一个动态组,没有
选择功能:

var body: some View
{
    VStack
    {
        List(selection: $selection)     // << here !!
        {ForEach(enquiries, id: \.self)
        {enquiry in
            EnquiryListRow(enquiry: enquiry)
                .gesture(TapGesture(count: 2).onEnded {
                    print("double clicked")
                    selection = enquiry
                })
        }}
    }
}
var主体:一些视图
{
VStack
{

列表(selection:$selection)/在第二种情况下也应该使用列表-
ForEach
只是一个动态组,它没有
选择
功能:

var body: some View
{
    VStack
    {
        List(selection: $selection)     // << here !!
        {ForEach(enquiries, id: \.self)
        {enquiry in
            EnquiryListRow(enquiry: enquiry)
                .gesture(TapGesture(count: 2).onEnded {
                    print("double clicked")
                    selection = enquiry
                })
        }}
    }
}
var主体:一些视图
{
VStack
{

List(selection:$selection)/如果没有丢失的代码,重现错误有点困难。不过,我已经编写了一些代码,您可以复制并粘贴这些代码以使其正常工作

请在下面找到我的测试和工作示例:

导入快捷界面
进口基金会
导入CoreData
类PersistentContainer{
公共静态变量容器:NSPersistentContainer={
let container=NSPersistentContainer(名称:“DataModel”)
中的container.loadPersistentStores(completionHandler:{(storeDescription,错误)
如果let error=错误为N错误{
fatalError(“未解决的错误\(error),\(error.userInfo)”)
}
})
container.viewContext.automaticallyMergesChangesFromParent=true
container.viewContext.mergePolicy=NSMergeByPropertyObjectTrumpMergePolicy
返回容器
}()
私有init(){}
}
类数据模型:ObservableObject{
私有变量上下文:NSManagedObjectContext
@已发布的公众var查询:[查询]
init(){
self.\u context=PersistentContainer.container.viewContext
self.inquiries=try!self.\u context.fetch(inquiry.fetchRequest())
}
}
结构查询列表:视图{
公众查询:查询
var body:一些观点{
文本(\(self.Enquiry.name??(未给出名称))
}
}
结构ContentView:View{
@StateObject变量模型=数据模型()
@国有-私有风险值选择:查询?=无
var body:一些观点{
列表(self.model.inquiries,id:\.self,selection:self.$selection){inquiry in
查询热线(查询:查询)
.手势(轻触手势(计数:2)。已启用{
打印(“双击”)
自我选择=查询
})
.同时手势(轻触手势().ONENED{
打印(“单击一次”)
自我选择=查询
})
}
}
}
结构内容视图\u预览:PreviewProvider{
静态var预览:一些视图{
ContentView()
}
}

如果没有丢失的代码,重现错误会有点困难。不过,我已经编写了一些代码,您可以复制并粘贴这些代码以使其正常工作

请在下面找到我的测试和工作示例:

导入快捷界面
进口基金会
导入CoreData
类PersistentContainer{
公共静态变量容器:NSPersistentContainer={
let container=NSPersistentContainer(名称:“DataModel”)
中的container.loadPersistentStores(completionHandler:{(storeDescription,错误)
如果let error=错误为N错误{
fatalError(“未解决的错误\(error),\(error.userInfo)”)
}
})
container.viewContext.automaticallyMergesChangesFromParent=true
container.viewContext.mergePolicy=NSMergeByPropertyObjectTrumpMergePolicy
返回容器
}()
私有init(){}
}
类数据模型:ObservableObject{
私有变量上下文:NSManagedObjectContext
@已发布的公众var查询:[查询]
init(){
self.\u context=PersistentContainer.container.viewContext
self.inquiries=try!self.\u context.fetch(inquiry.fetchRequest())
}
}
结构查询列表:视图{
公众查询:查询
var body:一些观点{
文本(\(self.Enquiry.name??(未给出名称))
}
}
结构ContentView:View{
@StateObject变量模型=数据模型()
@国有-私有风险值选择:查询?=无
var body:一些观点{
列表(self.model.inquiries,id:\.self,selection:self.$selection){inquiry in
查询热线(查询:查询)
.手势(轻触手势(计数:2)。已启用{
打印(“双击”)
自我选择=查询
})
.同时手势(轻触手势().ONENED{
打印(“单击一次”)
自我选择=查询
})
}
}
}
结构内容视图\u预览:PreviewProvider{
静态var预览:一些视图{
ContentView()
}
}

第二个示例不起作用?第一个示例对我来说很好是的,这是我的问题。如何使第二个示例像第一个示例一样工作。第二个示例不起作用?第一个示例对我来说很好是的,这是我的问题。如何使第二个示例像第一个示例一样工作。如果我做了更改,我会得到初始值设定项的init(\uID:selection:rowContent:)”要求“FetchRequest”符合“RandomAccessCollection”。有什么建议吗?这不起作用。我必须在列表中使用wrappedValue使其编译,但随后它没有显示任何行。还原到ForEach(没有选择)确实显示了行。我没有您的所有代码,因此无法测试,请尝试更新-合并列表和ForEach,如果后者适合您。添加