小编典典

SwiftUI View和@FetchRequest谓词带有可以更改的变量

swift

我有一个视图,显示团队中使用@Fetchrequest和固定谓词“ Developers”过滤的消息。

struct ChatView: View {

@FetchRequest(
    sortDescriptors: [NSSortDescriptor(keyPath: \Message.createdAt, ascending: true)],
    predicate: NSPredicate(format: "team.name == %@", "Developers"),
    animation: .default) var messages: FetchedResults<Message>

@Environment(\.managedObjectContext)
var viewContext

var body: some View {
    VStack {
        List {
            ForEach(messages, id: \.self) { message in
                VStack(alignment: .leading, spacing: 0) {
                    Text(message.text ?? "Message text Error")
                    Text("Team \(message.team?.name ?? "Team Name Error")").font(.footnote)
                }
            }...

我想使该谓词动态化,以便在用户切换团队时显示该团队的消息。下面的代码给我以下错误

无法在属性初始化程序中使用实例成员’teamName’;属性初始化程序在“自我”可用之前运行

struct ChatView: View {

@Binding var teamName: String

@FetchRequest(
    sortDescriptors: [NSSortDescriptor(keyPath: \Message.createdAt, ascending: true)],
    predicate: NSPredicate(format: "team.name == %@", teamName),
    animation: .default) var messages: FetchedResults<Message>

@Environment(\.managedObjectContext)
var viewContext

...

我可以为此提供一些帮助,但到目前为止我还无法自行解决。


阅读 249

收藏
2020-07-07

共1个答案

小编典典

有同样的问题,Brad Dillon的评论显示了解决方案:

var predicate:String
var wordsRequest : FetchRequest<Word>
var words : FetchedResults<Word>{wordsRequest.wrappedValue}

    init(predicate:String){
        self.predicate = predicate
        self.wordsRequest = FetchRequest(entity: Word.entity(), sortDescriptors: [], predicate:
            NSPredicate(format: "%K == %@", #keyPath(Word.character),predicate))

    }

在此示例中,您可以在初始化程序中修改谓词。

2020-07-07