如何在 SwiftUI 中设置自定义环境键? [英] How to set a custom environment key in SwiftUI?

查看:42
本文介绍了如何在 SwiftUI 中设置自定义环境键?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

创建自定义环境键有效,但如果我希望在视图中设置该值,XCODE 不允许这样做.但是可以设置预定义的环境值.我做错了什么?

Creating a custom environment key works, but if I wish to set the value in a view, XCODE doesn't allow it. But the predefined environment values can be set. What am I doing wrong?

struct ResetDefault: EnvironmentKey {
    static var defaultValue: Bool = false
}

extension EnvironmentValues {
    var resetDefault: Bool {
        get { self[ResetDefault.self] }
        set { self[ResetDefault.self] = newValue }
    }
}

struct ResetView: View {
    @Environment(\.resetDefault) var reset
    var body: some View {
        Text("Reset").onAppear() {
            reset = true.        // Cannot assign to property: 'reset' is a get-only property
        }
    }
}

推荐答案

Environment 用于在 parent > 中传递值.child 方向,因此设置值以供使用.如果您想更改环境值的内部,那么您需要以某种方式包装它,可能的变体是绑定或引用类型持有者.

The Environment is used to pass values in parent > child direction, so value is set for usage. If you want to change internal of environment value then you need to wrap it somehow, possible variants are binding or reference type holder.

这里是一个基于绑定的用法示例(类似于 .editMode 和 .presentationMode 的工作方式)

Here is an example of usage based on binding (similar to how .editMode and .presentationMode work)

struct TestResetEnv: View {
    @State private var isActive = false
    @State private var reset = false
    var body: some View {
        VStack {
            Text("Current: \(reset ? "true" : "false")")
            Button("Go") { self.isActive.toggle() }
            if isActive {
                ResetView()
            }
        }.environment(\.resetDefault, $reset) // set for children as env!!
    }
}

struct ResetDefault: EnvironmentKey {
    static var defaultValue: Binding<Bool> = .constant(false)
}

extension EnvironmentValues {
    var resetDefault: Binding<Bool> {
        get { self[ResetDefault.self] }
        set { self[ResetDefault.self] = newValue }
    }
}

struct ResetView: View {
    @Environment(\.resetDefault) var reset
    var body: some View {
        Text("Reset").onAppear() {
            self.reset.wrappedValue.toggle() // << change wrapped !!
        }
    }
}

这篇关于如何在 SwiftUI 中设置自定义环境键?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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