【问题标题】:SwiftUI and Combine - Update variable in view model when another changesSwiftUI 和组合 - 当另一个更改时更新视图模型中的变量
【发布时间】:2023-03-10 12:15:01
【问题描述】:

我目前正在构建一个小型单视图应用程序来帮助学习更多 SwiftUI。 该应用程序是一个简单的应用程序来计算比率值。我目前有 4 个主要变量,比率的左侧和右侧,以及将按比率计算的第一个和第二个值。 最初,我将这些中的每一个都存储为 @State 属性:

@State var leftSide = Double()
@State var rightSide = Double()
@State var value1 = Double()
@State var value2 = Double()

在应用程序中,有 4 个滑块允许每个变量相互独立地更改。我现在要允许发生的是更改变量value1 也将根据用户设置的比率更新value2。为了实现这一点,我相信我需要使用组合但是我对框架没有太多经验。

首先,我将变量移至 ObservableObject 类:

final class UserData: ObservableObject {
    @Published var leftSide = Double()
    @Published var rightSide = Double()
    @Published var value1 = Double()
    @Published var value2 = Double()
}

我用@ObservedObject var userData = UserData() 更新了我的主视图,这样我就可以访问我视图中的变量,这工作正常

现在我想在其他变量发生变化时更新 value1 和 value2 变量。从我所做的阅读中,我认为我需要使用订阅者,但我找不到任何关于如何使用他们的@Published 属性进行设置的信息。我是否以正确的方式解决了这个问题,还是有更好的方法来做到这一点?

【问题讨论】:

  • 我正在研究使用 didSet,我认为这会起作用

标签: ios swift swiftui combine


【解决方案1】:

我目前有4个主要变量,左侧和右侧 比率,以及第一个和第二个值将计算比率

那么,为什么不将其声明为计算变量?

final class UserData: ObservableObject {
    @Published var leftSide = 0.0
    @Published var rightSide = 0.0
    var value: Double {
        // perform the calculation here
        ...
    }
}

如果你想独立改变值(绑定到 SwiftUI 组件),并在修改 leftSide 或 rightSide 的情况下修改值,使用 willSet 甚至 didSet

final class UserData: ObservableObject {
    @Published var leftSide = 0.0 {
        willSet {
           // update value 
            value = f(newValue)
        }
        didSet {
           // update value
           value = f(oldValue)
        }
    }
    @Published var rightSide = 0.0
    @Published var value = 0.0
    func f(_ v: Double)->Double {
        ......
    }
}

【讨论】:

  • 我认为这个建议是正确的 - 使用 Combine 来计算值是可行的,但可能比您实际想要或需要的开销要大得多。如果你想做这样的事情,你可以在 Using Combine 的一些示例代码中看到一个如何工作的例子:github.com/heckj/swiftui-notes/blob/master/SwiftUI-Notes/…
猜你喜欢
  • 2020-11-26
  • 2020-04-10
  • 1970-01-01
  • 2021-03-30
  • 2021-06-01
  • 2011-08-09
  • 1970-01-01
  • 2017-02-23
  • 2015-09-19
相关资源
最近更新 更多