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