SwiftUI 从列表项视图中隐藏列表项 [英] SwiftUI hide list item from list item view

查看:51
本文介绍了SwiftUI 从列表项视图中隐藏列表项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以,假设我有一个 SwiftUI 列表和切换(大大简化):

So, let's say I have a SwiftUI List and Toggle (heavily simplified):

List {

    Toggle(isOn: $isOn) {

        Text("Toggle")

    }

    ForEach(arr) { item in

        if isOn || !item.isComplete {

            Row(item: item)
        }

    }

}

然后是我的行:

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?

推荐答案

请注意,当涉及到大量数据时,列表仍然有问题.在这里,您有一个示例可以满足您的要求.我传递的是 ObservableObject,但你也可以把它放在环境中.这取决于你.

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. 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")

        }
    }
}

这篇关于SwiftUI 从列表项视图中隐藏列表项的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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