简体   繁体   English

SwiftUI从列表项视图中隐藏列表项

[英]SwiftUI hide list item from list item view

So, let's say I have a SwiftUI List and Toggle (heavily simplified): 因此,假设我有一个SwiftUI列表和Toggle(已大大简化):

List {

    Toggle(isOn: $isOn) {

        Text("Toggle")

    }

    ForEach(arr) { item in

        if isOn || !item.isComplete {

            Row(item: item)
        }

    }

}

Then my Row: 然后我的行:

HStack {

    Button(action: {

        self.item.isComplete.toggle() // isComplete is a Boolean value

    }) {

        Text("Button")

    }

    Text(item.isComplete ? "Complete" : "Not complete")

}

The toggle should change the list, swapping between all items, and only non-completed items. 切换按钮应更改列表,在所有项目之间切换,仅在未完成的项目之间切换。 This works perfectly. 这很完美。 However, I want this to function so that when I press the button, the list is updated instantly and it goes away, rather than me having to re-switch the toggle. 但是,我希望此功能起作用,以便当我按下按钮时,列表会立即更新并消失,而无需我重新切换切换开关。 How can this be done? 如何才能做到这一点?

Note that Lists are still buggy when it comes to large sets of data. 请注意,在涉及大量数据时,列表仍然存在问题。 Here you have an example that does what you asked. 在这里,您有一个示例可以完成您所要求的。 I am passing the ObservableObject, but you can also put it in the environment. 我正在传递ObservableObject,但您也可以将其放在环境中。 That's up to you. 随你(由你决定。

import SwiftUI

struct Item: Identifiable {
    let id = UUID()
    var isComplete: Bool = false
}

class Model: ObservableObject {
    @Published var isOn: Bool = false
    @Published var arr = [Item(isComplete: true), Item(isComplete: false), Item(isComplete: true), Item(isComplete: false), Item(isComplete: true), Item(isComplete: true)]
}

struct ContentView: View {
    @ObservedObject var model = Model()

    var body: some View {
        List {

            Toggle(isOn: $model.isOn) { Text("Toggle") }

            ForEach(self.model.arr.filter { model.isOn ? true : $0.isComplete }) { item in
                Row(item: item, model: self.model)
            }
        }
    }
}

struct Row: View {
    let item: Item
    @ObservedObject var model: Model

    var body: some View {
        HStack {

            Button(action: {

                if let idx = self.model.arr.firstIndex(where: { $0.id == self.item.id }) {
                    self.model.arr[idx].isComplete.toggle()
                    self.model.isOn = false
                }

            }) {

                Text("Button")

            }

            Text(item.isComplete ? "Complete" : "Not complete")

        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM