首页 > 解决方案 > 从另一个未在 | 中声明的类修改 @Published 变量 SwiftUI

问题描述

我想把我所有的逻辑@Published放在一个模型类中,但是当我尝试分离它时,它不会更新。我重新创建了一个小例子:

下面的代码有效,每次单击按钮时它都会增加:

struct ContentView: View {

    @StateObject var myClass = MyClass()

    var body: some View {
        Button(action: {
            myClass.doStuff(numb: 1)
        }) {
            Text("People: \(myClass.people)")
        }
    }
}


class MyClass: ObservableObject {
    @Published var people: Int = 0

    func doStuff(numb: Int) {
        people += numb
    }
}

但是,一旦我拆分逻辑并尝试将我的 @Published 放在一个单独的类中以使其更干净,它就不会更新,见下文:

struct ContentView: View {
    
    @StateObject var myClass = MyClass()
    
    let modify = Modify()
    
    var body: some View {
        Button(action: {
            modify.doStuff(numb: 1)
        }) {
            Text("People: \(myClass.people)")
        }
    }
}

class Modify {
    var myClass = MyClass()
    
    func doStuff(numb: Int) {
        myClass.people += numb
    }
}


class MyClass: ObservableObject {
    @Published var people: Int = 0
}

我认为这是因为视图中有两个不同的实例,对吗?无论如何,我怎样才能正确地将@Publish 分开并更新它?

谢谢

标签: swiftswiftui

解决方案


问题是您有 2 个单独的实例MyClass

@StateObject var myClass = MyClass()

var myClass = MyClass()

您正在更新myClassin Modify,而您没有从中收到更新。解决此问题的一种方法是在初始化期间MyClass传入, 的一个实例:Modify

struct ContentView: View {
    @StateObject var myClass: MyClass
    let modify: Modify

    init() {
        let temp = MyClass()
        _myClass = StateObject(wrappedValue: temp)
        modify = Modify(myClass: temp)
    }

    var body: some View {
        Button(action: {
            modify.doStuff(numb: 1)
        }) {
            Text("People: \(myClass.people)")
        }
    }
}

class Modify {
    let myClass: MyClass

    init(myClass: MyClass) {
        self.myClass = myClass
    }

    func doStuff(numb: Int) {
        myClass.people += numb
    }
}

另一种方法是有一个@Published属性Modify来观察 的变化MyClass

struct ContentView: View {
    @StateObject var modify = Modify()

    var body: some View {
        Button(action: {
            modify.doStuff(numb: 1)
        }) {
            Text("People: \(modify.myClass.people)")
        }
    }
}

class Modify: ObservableObject {
    @Published var myClass = MyClass()
    private var anyCancellable: AnyCancellable?

    init() {
        anyCancellable = myClass.objectWillChange.sink { [weak self] _ in
            self?.objectWillChange.send()
        }
    }

    func doStuff(numb: Int) {
        myClass.people += numb
    }
}

推荐阅读