在视图中重新实例化@EnvironmentObject

ASSeeger

在我的应用程序中,需要@EnvironmentObject轻按一下按钮重新实例化一个正确的位置在哪里?

这是我的视图的屏幕截图-在“存档的对象”列表中,我想拥有不可变的对象。因此,当我点击时Archive Object,我想将当前对象添加到数组并创建一个新的当前对象。

在此处输入图片说明

该应用程序的简化版本如下所示。

我在中实例化该对象SceneDelegate

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?

    var myObject = MyObject()
    let myObjects = MyObjects()

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {

        let contentView = ContentView()
            .environmentObject(myObject)
            .environmentObject(myObjects)

        if let windowScene = scene as? UIWindowScene {
            let window = UIWindow(windowScene: windowScene)
            window.rootViewController = UIHostingController(rootView: contentView)
            self.window = window
            window.makeKeyAndVisible()
        }
    }

    //.....
}

这是我的模型:

class MyObject: ObservableObject, Identifiable {
    @Published var id = UUID()
}

class MyObjects: ObservableObject {
    @Published var values: [MyObject] = [
        MyObject(),
        MyObject()
    ]
}

在我看来,我需要将当前对象放入一个(归档)数组,然后创建一个新的当前对象来使用。这是我正在尝试的:

struct ContentView: View {

    @EnvironmentObject var currentObject: MyObject
    @EnvironmentObject var objects: MyObjects

    var sceneDelegate: UISceneDelegate {
        guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
            let sd = windowScene.delegate as? SceneDelegate else { fatalError() }
        return sd
    }

    var body: some View {
        VStack {
            Form {
                Section(header: Text("Current Object")) {
                    Text(currentObject.id.uuidString)
                }
                Section(header: Text("Archived Objects")) {
                    List(objects.values, id: \.id) { object in
                        Text(object.id.uuidString)

                    }
                    Button(action: {
                        self.objects.values.append(self.currentObject)

// as the environment object is get only, I cannot reinstantiate it here...
//                        self.currentObject = MyObject()
                    }) {
                        Text("Archive Object")
                    }
                }
            }

            Spacer()
        }
    }
}
他的脾气

这是一个解决方案。查看内联评论。

经过Xcode 11.4 / iOS 13.4测试

演示

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {

        // Usage
        ContentView(current: MyObject())
            .environmentObject(MyObjects())
    }
}


struct ContentView: View {
    @EnvironmentObject var objects: MyObjects
    @State private var current: MyObject        // tracks current

    init(current: MyObject) {
        _current = State(initialValue: current)
    }

    var body: some View {
        // rebuilt on *current* changed
        ContentInnerView(current: $current)
            .environmentObject(current)
    }

    struct ContentInnerView: View {
        @Binding var current: MyObject   // change current

        @EnvironmentObject var objects: MyObjects
        @EnvironmentObject var currentObject: MyObject

        init(current: Binding<MyObject>) {
            _current = current
        }

        var sceneDelegate: UISceneDelegate {
            guard let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene,
                let sd = windowScene.delegate as? SceneDelegate else { fatalError() }
            return sd
        }

        var body: some View {
            VStack {
                Form {
                    Section(header: Text("Current Object")) {
                        Text(currentObject.id.uuidString)
                    }
                    Section(header: Text("Archived Objects")) {
                        List(objects.values, id: \.id) { object in
                            Text(object.id.uuidString)

                        }
                        Button(action: {
                            self.objects.values.append(self.currentObject)
                            self.current = MyObject() // << works !!
                        }) {
                            Text("Archive Object")
                        }
                    }
                }

                Spacer()
            }
        }
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从实例化视图中删除主键,但无法重新创建它-为什么?

来自分类Dev

为什么@EnvironmentObject强制视图重新初始化?

来自分类Dev

在视图中更新Swiftui @EnvironmentObject

来自分类Dev

在局部视图中实例化空模型?

来自分类Dev

在局部视图中实例化空模型?

来自分类Dev

最小化视图中的实例变量

来自分类Dev

在主干中消失(或重新实例化?)视图

来自分类Dev

如何从类而不是视图中更改@EnvironmentObject

来自分类Dev

是否可以在实例化视图中更改列类型?

来自分类Dev

从Interface Builder实例化的视图中的僵尸对象

来自分类Dev

骨干-实例化视图中包含旧数据

来自分类Dev

在视图中显式实例化商店时出错

来自分类Dev

如何在UWP中重新实例化页面/视图模型?

来自分类Dev

如何从UIApplicationDelegate实例“重新启动” iOS应用/重新实例化初始视图控制器?

来自分类Dev

mvc 视图中的范围问题导致 IList<t> 失败(是:如何在 mvc 视图中实例化 list<t>)

来自分类Dev

如何从UIApplicationDelegate实例“重启” iOS应用/重新实例化初始视图控制器?

来自分类Dev

扩展与重新实例化

来自分类Dev

实例化视图的ViewModel

来自分类Dev

如何在Django视图中正确获取序列化器实例?

来自分类Dev

在Backbone.js中的视图中实例化模型是一种反模式吗?

来自分类Dev

为什么SQL Developer认为我的实例化视图中存在错误?

来自分类Dev

如何在视图中的button_to方法中国际化实例变量?

来自分类Dev

将jsonb_each的输出保存在实例化视图中

来自分类Dev

无法在使用实例的视图中调用方法?

来自分类Dev

在KendoUI列表视图中拖放重新排序

来自分类Dev

响应视图中HTML元素的重新排序

来自分类Dev

重新实例化AngularJS Timer

来自分类Dev

休眠刷新实例化视图

来自分类Dev

使用XIB实例化视图

Related 相关文章

  1. 1

    从实例化视图中删除主键,但无法重新创建它-为什么?

  2. 2

    为什么@EnvironmentObject强制视图重新初始化?

  3. 3

    在视图中更新Swiftui @EnvironmentObject

  4. 4

    在局部视图中实例化空模型?

  5. 5

    在局部视图中实例化空模型?

  6. 6

    最小化视图中的实例变量

  7. 7

    在主干中消失(或重新实例化?)视图

  8. 8

    如何从类而不是视图中更改@EnvironmentObject

  9. 9

    是否可以在实例化视图中更改列类型?

  10. 10

    从Interface Builder实例化的视图中的僵尸对象

  11. 11

    骨干-实例化视图中包含旧数据

  12. 12

    在视图中显式实例化商店时出错

  13. 13

    如何在UWP中重新实例化页面/视图模型?

  14. 14

    如何从UIApplicationDelegate实例“重新启动” iOS应用/重新实例化初始视图控制器?

  15. 15

    mvc 视图中的范围问题导致 IList<t> 失败(是:如何在 mvc 视图中实例化 list<t>)

  16. 16

    如何从UIApplicationDelegate实例“重启” iOS应用/重新实例化初始视图控制器?

  17. 17

    扩展与重新实例化

  18. 18

    实例化视图的ViewModel

  19. 19

    如何在Django视图中正确获取序列化器实例?

  20. 20

    在Backbone.js中的视图中实例化模型是一种反模式吗?

  21. 21

    为什么SQL Developer认为我的实例化视图中存在错误?

  22. 22

    如何在视图中的button_to方法中国际化实例变量?

  23. 23

    将jsonb_each的输出保存在实例化视图中

  24. 24

    无法在使用实例的视图中调用方法?

  25. 25

    在KendoUI列表视图中拖放重新排序

  26. 26

    响应视图中HTML元素的重新排序

  27. 27

    重新实例化AngularJS Timer

  28. 28

    休眠刷新实例化视图

  29. 29

    使用XIB实例化视图

热门标签

归档