我要做什么:将对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'
答案 0 :(得分:1)
您可能会遇到此错误,可能是因为name
属性在数据模型中被定义为可选字符串。
Text
结构没有可选值。它必须是一个明确的值,即:
StringProtocol
因此,您将需要对传递给LogRectangle
的模型进行一些更改。这些更改既可以在数据模型级别进行(然后更新关联的NSManagedObject
类,也可以在模型上具有计算属性,以提供该属性的非可选值。
答案 1 :(得分:0)
使用testObject索引作为列表,而不是迭代实际对象,可能会更好。试试这个:
List(testObjects.indices, id: \.self) { index in
LogRectangle(testObject: testObjects[index])
}