swift - 从另一个未在 | 中声明的类修改 @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 分开并更新它?
谢谢
解决方案
问题是您有 2 个单独的实例MyClass
:
@StateObject var myClass = MyClass()
var myClass = MyClass()
您正在更新myClass
in 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
}
}
推荐阅读
- vuejs2 - 默认在延迟加载模式下扩展元素 UI 树 - Vue
- r - 如何在同一字符串中使用值和“文本”进行注释:ggplot2
- sql - 有没有一种方法可以从 DBMS 方面验证表中是否已经检查了“布尔”列(true)但仅针对行的子集
- javascript - 使用 innerHTML 添加 HTML 元素时管理它们的顺序
- python - 当我尝试查找特定行时,保存在显示空值的变量上的文本
- html - Firefox 在标签之间添加水平间距
- r - 在 R 中创建分组条形图
- javascript - 如何让 Angular Universal 和 PWA 协同工作?
- asp.net-core - HTTP 错误 502.5 - ANCM 进程外启动失败 - .net core 2.2
- html - 如何在 Font Awesome 图标中删除下面的行?