【问题标题】:Initialising a variable in SwiftUi view from CoreData FetchRequest从 CoreData FetchRequest 初始化 SwiftUi 视图中的变量
【发布时间】:2021-05-17 08:57:13
【问题描述】:

我对 SwiftUI 比较陌生,希望有一个视图,用户可以在其中从 Picker 中的 CoreData FetchRequest 中选择结果。我在视图结构内部但在视图主体外部有以下几行,

@FetchRequest(
    entity: Person.entity(),
        sortDescriptors: [
            NSSortDescriptor(keyPath: \Person.name, ascending: true)
        ]
) var people: FetchedResults<Person>
    
@State var currentPerson:Person

在视图主体中,我有一个选择器,它将所选值保存到 currentPerson 但是当我尝试在模拟器中运行程序时,我收到一条错误消息 Missing argument for parameter 'currentPerson' in call 在文件末尾的预览结构中。

如果我尝试使用people 中的第一项初始化currentPerson,我会收到一条错误消息,指出Cannot use instance member 'people' within property initializer; property initializers run before 'self' is available

除了将Person 对象传递到视图中之外,我工作的另一个解决方案是创建一个对象来初始化currentPerson 变量是创建一个Person 对象但不将托管对象上下文传递为参数。

但是,当我运行程序时,它在控制台中显示CoreData: error: Failed to call designated initializer on NSManagedObject class 'Person',但程序按预期运行。

这是最好的方法还是我错过了一些更好的方法? 谢谢!

【问题讨论】:

  • 问题是您试图 (1) 运行 fetch 请求和 (2) 同时设置 currentPerson 变量。实际上,您需要先完成获取请求,然后才能访问返回的数据。一种解决方案可能是使 currentPerson 可选并在没有值的情况下对其进行初始化(@State var currentPerson:Person = nil)。
  • @nicksarno 它也需要一个问号 -- @State var currentPerson : Person? = nil
  • @nicksarno @jnpdx 感谢您的帮助,这正是我想要的!我还必须将as Person? 添加到 Picker 标签中,并检查currentPerson 变量是否仍然是nil

标签: swift core-data swiftui


【解决方案1】:

使用可计算的属性。在 self 可用之前不会调用它。然后,如上所述,为第一人称使用可选的计算属性。

var people : [Person] {
    let fetchRequest = Person.fetchRequest()
    fetchRequest.sortDescriptors = [NSSortDescriptor(keyPath: \Person.name, ascending: true)]

    return fetchRequest.wrappedValue
}

var currentPerson : Person? {
    return people.first
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 2020-07-09
    • 1970-01-01
    相关资源
    最近更新 更多