SwiftUI - 使用 CoreData 获取的结果来填充选取器

Posted

技术标签:

【中文标题】SwiftUI - 使用 CoreData 获取的结果来填充选取器【英文标题】:SwiftUI - Using CoreData Fetched Result to Populate Picker 【发布时间】:2019-09-19 21:18:13 【问题描述】:

我正在按照我在网上看到的每个指南将托管对象引入到带有环境的 SwiftUI 场景中,然后在场景中运行 @FetchRequest,这一切都很好。

我可以使用该结果来填充选择器的值

这就是我所拥有的

CoreData 对象

    public class CD_LookupData: NSManagedObject,Identifiable 


extension CD_LookupData 

    @nonobjc public class func fetchRequest() -> NSFetchRequest<CD_LookupData> 
        return NSFetchRequest<CD_LookupData>(entityName: "CD_LookupData")
    

    @NSManaged public var lookluptable: String?
    @NSManaged public var primarykeyid: String?
    @NSManaged public var value: String?


SwiftUI 视图

struct LabledSelectBoxCD: View 
    var label: String
    var lookupdata: FetchedResults<CD_LookupData>

    @Binding var value: Int

    var body: some View
    
        VStack(alignment: .leading)
        
            Picker(selection: $value, label: Text(""))
            
                ForEach(lookupdata, id: \.primarykeyid)
                 data in
                    Text(data.value ?? "Unknown")
                
            
        
    

它可以很好地使用值填充选择器,但我的默认值永远不会起作用,并且没有保存选择的值。

如果我只用一个字符串数组尝试相同的视图,它就可以完美地工作。

关于如何让它使用 primarykeyid 的值作为选择器的值的任何想法?

更新:

@Binding var value: String

Text(data.value ?? "Unknown").tag(data.primarykeyid)

不要做任何改变

【问题讨论】:

【参考方案1】:

您需要将值设为可选字符串,因为这就是 primaryKeyId 的类型

@Binding var value: String?

然后你需要在选择器的每个元素上加上一个标签来设置选择:

Text(data.value ?? "Unknown").tag(data.primaryKeyId)

【讨论】:

在 SwiftUI 中的这两个变化都不走运 应该是.tag(data.primaryKeyId) 是我,我试过“@Binding var value: String”而不是@Binding var value: String?现在一切都好,谢谢!

以上是关于SwiftUI - 使用 CoreData 获取的结果来填充选取器的主要内容,如果未能解决你的问题,请参考以下文章

如何在 SwiftUI 中从 FetchedResults (CoreData) 中获取 NSOrderedSet

SwiftUI CoreData - 如何更新获取请求和列表

SwiftUI CoreData - 存储获取请求数据

SwiftUI 中的 CoreData:如何清楚地获取属性?

使用 SwiftUI ForEach 从 NSOrderedSet 获取字符串值

来自先前选择器的选择器值 - CoreData/SwiftUI