每当在SwiftUI中更新CoreData时更新状态变量 [英] Update State-variable Whenever CoreData is Updated in SwiftUI

查看:70
本文介绍了每当在SwiftUI中更新CoreData时更新状态变量的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

从CoreData更新一些数据后,我还想将 State 变量更新为返回结果的数量.

After updating some data from CoreData, I also want to update a State-variable to the number of returned results.

更改CoreData时,应始终将 Stepper 设置为返回结果的数量.但是,当我使用 Stepper 时,也会触发 onAppear .如何在 onAppear 中检查是否更改了CoreData或使用了 Stepper ?那有可能吗?

When CoreData is changed, the Stepper should always be set to the number of returned results. However, onAppear fires also when I use the Stepper. How can I check in onAppear whether CoreData was changed or the Stepper was used? Is that even possible?

import SwiftUI

struct ContentView: View {
@State var numberOfResults = 0

@FetchRequest(entity: YourModel.entity(), sortDescriptors: [], predicate:NSPredicate(format: "isSelected == %@", NSNumber(booleanLiteral: true))) var objects: FetchedResults<YourModel>

var body: some View{
    return VStack{

        Stepper("text", value: $numberOfResults, in: 0...objects.wrappedValue.count, step:5)
            .onReceive(objects.publisher, perform: {_ in
                self.numberOfResults = self.objects.count
                print("onReceive")
            })
        }
    }
}

推荐答案

如果您使用@FetchRequest,则onReceive numberOfResults将在发布者发送消息时更新

If you use @FetchRequest and onReceive numberOfResults will be updated when the publisher sends a message

import SwiftUI

struct DidSetCoreData: View {
    @State var numberOfResults = 0
    @State var initSetup1: Bool = true
    @State var initSetup2: Bool = true
    @State var adjustedCount = 0
    @FetchRequest(entity: YourModel.entity(), sortDescriptors: [], predicate:NSPredicate(format: "isSelected == %@", NSNumber(booleanLiteral: true))) var objects: FetchedResults<YourModel>

    var body: some View{
    return VStack{
            Text("Total Count= \(objects.count)")
            Text("Adjusted Total = \($adjustedCount.wrappedValue)")
            //You need the separate adjusted count variable to save the changes

            //Option 1 Stepper - Keeps the max step flexible, eliminates the need for the numberOfResults var
            Stepper("AdjTotal - FlexibleMax", value: $adjustedCount, in: 0...objects.count, step:5)
            .onReceive(objects.publisher.count(), perform: {count in
                //onReceive will be called everytime there is a change to objects.count or body refresh
                print("onReceive - Option 1")
                if self.initSetup1{
                    //The variable will only be setup once
                    self.adjustedCount = count
                    self.initSetup1 = false
                    print("initSetupComplete - Option 1")
                }
            })

            //Option 2 Stepper
            Stepper("AdjTotal - initMax", value: $adjustedCount, in: 0...$numberOfResults.wrappedValue, step:5)

            .onReceive(objects.publisher.count(), perform: {count in
                //onReceive will be called everytime there is a change to objects.count or body refresh
                print("onReceive - Option 2")
                if self.initSetup2{
                    //The variables will only be setup once
                    self.numberOfResults = count //Limits the max step to only the original count
                    self.adjustedCount = self.numberOfResults
                    self.initSetup2 = false
                    print("initSetupComplete - Option 2")
                }
            })
            //Option 3 Stepper - Limits the StepperMax to the Stepper value
            Stepper("AdjTotal - ValueMax", value: $numberOfResults, in: 0...$numberOfResults.wrappedValue, step:5)
            .onReceive(objects.publisher.count(), perform: {count in
                //onReceive will be called everytime there is a change to objects.count or body refresh
                print("onReceive - Option 3")
                if self.initSetup3{
                    //The variable will only be setup once
                    self.numberOfResults = count
                    self.initSetup3 = false
                    print("initSetupComplete - Option 3")
                }
           })
        }
    }
}

这篇关于每当在SwiftUI中更新CoreData时更新状态变量的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆