多个 ViewModel 中的 @Published 数组 - SwiftUI

问题描述

我的应用程序只有两个视图,两个视图都有自己的 ViewModel。 ViewA 显示和操作来自 selectedNumbers 数组的对象。 ViewB 拥有所有可用的对象(数字)——在这个视图中,我想操作被 ViewA 使用的 selectedNumbers 数组。

我试图找出如何在这两个 ViewModel 之间共享这些 selectedNumbers 数组。我尝试使用 EnvironmentObject、StaticObject 等。但没有任何工作可以满足我的需要。我应该使用什么方法来达到预期的结果。感谢帮助!

import SwiftUI

struct ViewA: View {

    @ObservedObject var viewModel = ViewModelA()

    var body: some View {
        VStack {
            Text("\(viewModel.number)")
                .font(.largeTitle)
                .padding()
                .onTapGesture {
                    viewModel.showNext()
                }
            ViewB()
        }
    }
}

class ViewModelA: ObservableObject {
    var numbers: [Int] = []
    @Published var number: Int
    var index = 0

    init() {
        number = numbers.isEmpty ? 0 : numbers[index]
    }

    func showNext() {
        guard !numbers.isEmpty else { return }
        if index < numbers.count - 1 {
            index += 1
        } else {
            index = 0
        }
        number = numbers[index]
    }
}

struct ViewB: View {

    @ObservedObject var viewModel = ViewModelB()

    var body: some View {
        HStack {
            ForEach(viewModel.numbers,id: \.self) { number in
                Text("\(number)")
                    .foregroundColor(viewModel.selectedNumbers.contains(number) ? .red : .black)
                    .onTapGesture {
                        viewModel.updateSelection(number)
                    }
            }
        }
    }
}

class ViewModelB: ObservableObject {
    @Published var numbers: [Int] = []
    @Published var selectedNumbers: [Int] = []

    init() {
        numbers.append(contentsOf: [1,2,3,4,5,6,7,8])
    }

    func updateSelection(_ number: Int) {
        if selectedNumbers.contains(number) {
            selectedNumbers.remove(number)
        } else {
            selectedNumbers.append(number)
        }
    }
}

extension Array where Element: Equatable {
    mutating func remove(_ object: Element) {
        guard let index = firstIndex(of: object) else {return}
        remove(at: index)
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)