0

在使用 SwiftUI 开发 iOS 应用程序时,我面临以下情况。根据我在网上的一些教程中找到的内容,我设置了一个自定义环境密钥。这是 SceneDelegate.swift 文件中的相关代码。

    .....
    private struct RowColorMaster: EnvironmentKey {
        static let defaultValue:[[String:Color]] = [[:]]
    }

    extension EnvironmentValues {
        var rowColorMasterDico:[[String:Color]] {
            get {self[RowColorMaster.self]}
            set {self[RowColorMaster.self] = newValue}
        }
    }
    .....
    var rowColorMasterDico:[[String:Color]]
    // Initialize rowColorMasterDico:
    rowColorMasterDico = ......
    .....
    let contentView = ContentView(.....)
                            .environment(\.managedObjectContext, context)
                            .environment(\.rowColorMasterDico, rowColorMasterDico)
    .....

然后在某个文件中进一步向下查看层次结构:

    .....
    @Environment(\.rowColorMasterDico) var rowColorMasterDico
    .....

    func handleEvent(_ file: String, flag: Bool) {
        rowColorMasterDico[page.index][file] = flag ? Color.red : Color.white
    }

起初一切似乎都很顺利,直到我遇到了这个错误消息的 handleEvent 函数的执行:

    Cannot assign through subscript: 'rowColorMasterDico' is a get-only property

我可以在我的代码中修改什么(可能是我的自定义环境键的设置方式)以便能够通过下标进行分配?

4

1 回答 1

1

使您的 Environment 对象可绑定。这是可能的解决方案

一、做绑定

private struct RowColorMaster: EnvironmentKey {
    static var defaultValue: Binding<[[String:Color]]> = .constant([[:]])
}

extension EnvironmentValues {
    var rowColorMasterDico: Binding<[[String:Color]]> {
        get {self[RowColorMaster.self]}
        set {self[RowColorMaster.self] = newValue}
    }
}

接下来,在您的父视图中创建一个状态变量

@State private var rowColorMasterDico:[[String:Color]] = []

var body: some Scene {
    WindowGroup {
        RootView()
            .environment(\.rowColorMasterDico, $rowColorMasterDico)
    }
}

现在,在子视图中

@Environment(\.rowColorMasterDico) var rowColorMasterDico

func handleEvent(_ file: String, flag: Bool) {
    rowColorMasterDico.wrappedValue[page.index][file] = flag ? Color.red : Color.white
}
于 2021-04-27T14:11:41.520 回答