Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swiftui 跟踪已发布项列表的状态变量_Swiftui - Fatal编程技术网

Swiftui 跟踪已发布项列表的状态变量

Swiftui 跟踪已发布项列表的状态变量,swiftui,Swiftui,我正在学习SwiftUI,在数据流方面遇到了问题。 我不知道如何创建一个“state”变量来跟踪已发布子项的列表 如果至少选择了一个子项,则我需要一个为true的变量。这些项映射到SwiftUI切换开关,可以正常工作。(不允许生成计算属性) 属性包装器无法应用于计算属性 在我看来,我们可以做 if main.selectedItemsExist { Text("This text is shown if at least on toggle is on") } 感谢您的指导 请在下面的

我正在学习SwiftUI,在数据流方面遇到了问题。 我不知道如何创建一个“state”变量来跟踪已发布子项的列表

如果至少选择了一个子项,则我需要一个为true的变量。这些项映射到SwiftUI切换开关,可以正常工作。(不允许生成计算属性)

属性包装器无法应用于计算属性

在我看来,我们可以做

if main.selectedItemsExist {
    Text("This text is shown if at least on toggle is on")
}

感谢您的指导

请在下面的演示中找到如何做到这一点。使用Xcode 11.2/iOS 13.2进行测试

class Main : ObservableObject {

    @Published var items : [Item] {
        didSet { // << as item is value array will be updated on item changed
            var exists = false
            for item in items {
                if item.selected {
                    exists = true
                    break
                }
            }
            self.selectedItemsExist = exists
        }
    }

    @Published var selectedItemsExist : Bool = false

    init(items: [Item]) {
        self.items = items
    }
}


struct Item : Identifiable { // << value type, so changed on any property change
    var id = UUID()
    var name : String!
    var selected : Bool = false
    init(_ name: String) {
        self.name = name
    }
}

struct TestCalculablePublishing: View {
    @ObservedObject var main = Main(items: [Item("1"), Item("2"), Item("3")])

    var body: some View {
        VStack {
            Button("Test") {
                self.main.items[1].selected.toggle() // << just for test purpose
            }
            if main.selectedItemsExist {
                Text("This text is shown if at least on toggle is on")
            }
        }
    }
}

struct TestCalculablePublishing_Previews: PreviewProvider {
    static var previews: some View {
        TestCalculablePublishing()
    }
}
class Main:ObservableObject{
@已发布的var项目:[项目]{

didSet{//谢谢!我需要我的项目是引用类型,但是“didSet”方法帮助我使其工作。
class Main : ObservableObject {

    @Published var items : [Item] {
        didSet { // << as item is value array will be updated on item changed
            var exists = false
            for item in items {
                if item.selected {
                    exists = true
                    break
                }
            }
            self.selectedItemsExist = exists
        }
    }

    @Published var selectedItemsExist : Bool = false

    init(items: [Item]) {
        self.items = items
    }
}


struct Item : Identifiable { // << value type, so changed on any property change
    var id = UUID()
    var name : String!
    var selected : Bool = false
    init(_ name: String) {
        self.name = name
    }
}

struct TestCalculablePublishing: View {
    @ObservedObject var main = Main(items: [Item("1"), Item("2"), Item("3")])

    var body: some View {
        VStack {
            Button("Test") {
                self.main.items[1].selected.toggle() // << just for test purpose
            }
            if main.selectedItemsExist {
                Text("This text is shown if at least on toggle is on")
            }
        }
    }
}

struct TestCalculablePublishing_Previews: PreviewProvider {
    static var previews: some View {
        TestCalculablePublishing()
    }
}