SwiftUI:如何将核心数据对象传递给视图?

时间:2019-10-11 15:57:47

标签: ios swift xcode swiftui

我要做什么:将对FetchRequest(此处来自:TestView)的NSManagedObject的引用传递给另一个子视图(此处:LogRectangle)。

我尝试过的事情: 这些基本上是重要行

List(testObjects, id: \.self) { habit in
    LogRectangle(testObject: testObject)
}

这是整个代码:

struct TestView : View {
    @Environment(\.managedObjectContext) var managedObjectContext
    @FetchRequest(
        entity: TestObject.entity(),
        sortDescriptors: [NSSortDescriptor(keyPath: \TestObject.name, ascending: true)]
    ) var testObjects: FetchedResults<TestObject>


    var body: some View {
        NavigationView {
            HStack {
                Button(action: {
                    let testObject = TestObject(context: self.managedObjectContext)
                    habit.name = "TestObject String"
                    do {
                        try self.managedObjectContext.save()
                    } catch {
                        // handle the Core Data error
                    }
                }) {
                    Text("Insert example TestObject")
                }
                List(testObjects, id: \.self) { habit in
                    LogRectangle(testObject: testObject)
                }
            }
                .navigationBarTitle("Test")
        }
    }
}

struct LogRectangle : View {
    var habit : TestObject

    var body: some View {
        Text(habit.name)
            .font(.title)
            .foregroundColor(.white)        
    }
}

在这里,我在类LogRectangle中的文本行上遇到此错误。

Cannot convert value of type 'String?' to expected argument type 'LocalizedStringKey'

2 个答案:

答案 0 :(得分:1)

您可能会遇到此错误,可能是因为name属性在数据模型中被定义为可选字符串。

Text结构没有可选值。它必须是一个明确的值,即:

  • 符合StringProtocol
  • 的值
  • 可用于加载本地化字符串的文字字符串

Parameters for Text struct

因此,您将需要对传递给LogRectangle的模型进行一些更改。这些更改既可以在数据模型级别进行(然后更新关联的NSManagedObject类,也可以在模型上具有计算属性,以提供该属性的非可选值。

答案 1 :(得分:0)

使用testObject索引作为列表,而不是迭代实际对象,可能会更好。试试这个:

List(testObjects.indices, id: \.self) { index in
     LogRectangle(testObject: testObjects[index])
}