在@FetchRequest中输入动态值,以从SwiftUI中的核心数据中获取单个实体

时间:2019-12-03 13:54:04

标签: core-data swiftui ios13 xcode11

我看到了相同类型的错误,但是这里使用的是不同类型的代码,所以我认为最好在这种情况下提出一个新问题。我试图通过尝试将名为title的字符串变量(用作查找该实体的键)从核心数据中“查找特定实体”到@FetchRequest中。这是我使用的代码的一部分

struct AccountMainPage: View {
    //*** User input ***
    var title: String

    //*** Core data enviroment initialisation ***
    @Environment(\.presentationMode) var presentationMode: Binding<PresentationMode>
    @Environment(\.managedObjectContext) var managedObjectContext
    @FetchRequest(fetchRequest: Accounts.getSpecificAccounts(findTitle: title)) var fetchedAccount: FetchedResults<Accounts>


    var body: some View {
    //SOME CODE HERE
    }
}

公共类Accounts的扩展名为:

extension Accounts {
    static func getSpecificAccounts(findTitle: String) -> NSFetchRequest<Accounts> {
    let request: NSFetchRequest<Accounts> = Accounts.fetchRequest() as! NSFetchRequest<Accounts>

    let findDescriptor = NSPredicate(format: "title == %@",findTitle)

    request.predicate = findDescriptor

    return request
    }
}

但是,带有@FetchRequest(fetchRequest: Accounts.getSpecificAccounts(findTitle: title)) var fetchedAccount: FetchedResults<Accounts>的行存在语法错误:

  

不能在属性初始化程序中使用实例成员“ title”;属性初始化程序在“自我”可用之前运行

我的代码有问题吗?

1 个答案:

答案 0 :(得分:0)

@FetchRequest是动态属性,与其他任何属性一样,它会在调用您的AccountMainPage init之前初始化,因此self尚不可用,这就是为什么无法使用title成员的self属性,这与编译器错误说明有关。

所以这是一个可能的解决方案:我们用存根请求初始化获取请求属性,然后在稍后调用的init中,用实际获取请求重新初始化它。

这是一个方法演示(所有不相关的内容都已删除):

struct ContentView: View {
    var title: String

    @Environment(\.managedObjectContext) var managedObjectContext
    @FetchRequest(fetchRequest: Accounts.fetchRequest()) var fetchedAccount: FetchedResults<Accounts>

    init(title: String) {
        self.title = title
        _fetchedAccount = FetchRequest<Accounts>(fetchRequest: Accounts.getSpecificAccounts(findTitle: title))
    }

...