我想要三个SwiftUI Toggles,如果其中一个打开,其他两个都应该关闭。
使用UIKit的旧方法是didSet{},但在SwiftUI中不是正确的方式。我不知道是否需要深入了解Combine,才能解决这个问题,表面上看起来应该很简单。
import SwiftUI
// Mutually exclusive toggle switches: when one toggle is on, the other two should be off. This is a start, where to go from here?
struct Junk: View {
@State private var isOn1:Bool = true
@State private var isOn2:Bool = false
@State private var isOn3:Bool = false
var body: some View
{
VStack
{
Toggle("T1", isOn: $isOn1)
Toggle("T2", isOn: $isOn2)
Toggle("T3", isOn: $isOn3)
}
}
}
struct Junk_Previews: PreviewProvider
{
static var previews: some View
{
Junk()
}
}
UIKit
”方式不是正确的方式?也许它是 - 使用ObservableObject
代替三个@State变量。(请注意,我不是说这是正确的,只是说如果你有三个相互依赖的变量 - 就像你发布的代码一样 - 并且它们不是局部的View
,那么为什么不使用ObservableObject
呢?老实说,我认为那才是“正确的SwiftUI方式” - 它将UI与模型分离,将逻辑正确地移动到应该在的位置,除非你发布更多的代码?我需要听听为什么它不正确。 - user7014451willSet
,否则不会发生这种情况。再次强调,我认为您的问题在于您的示例——它可能是简化的(这是一个好问题),但却掩盖了您的意图——您真的需要三个本地Bools
吗?它们在使用ObservableObject
的模型中是否更有效?一旦这样做,使用Swift
代码如willSet
和didSet
有什么问题呢? - user7014451PresentationButton
现在变成了PresentationLink
。 很棒。2周后(beta4)?所有内容都已过时。 对于您来说?BindingObject
在beta 4中变成了ObservableObject
- 并且随着此更改,协议要求从didSet
更改为willSet
。 但是didSet
仍然有效!底层结构 -Combine
- 仍然存在(并幸运的是是开源的)。 - user7014451UIKit
应用程序需要三个Bool
值并且它们需要一起工作,您会如何设计它 - 在UIKit
中?一个单例?还是某些仅限于一个UIViewController
的本地东西?也许是框架目标?这真的很重要,因为在大多数情况下 - 除了一个本地情况之外 -SwiftUI
的答案实际上是使用Combine
。(两个月前,我在这里评论了很多次“范式转变”。这是几周以来我第一次这样做。) - user7014451