繁体   English   中英

使用 SwiftUI,我如何让一个 Toggle 改变另一个 Toggle 的状态?

[英]Using SwiftUI, how do I make one Toggle change the state of another Toggle?

我想要三个 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()
    }
}

由于我不知道您的设计面临什么挑战,因此我将不讨论是否是正确的方法(除非这是您的问题)。 但是,要实现您的要求,可以使用中间绑定:

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
    {
        let on1 = Binding<Bool>(get: { self.isOn1 }, set: { self.isOn1 = $0; self.isOn2 = false; self.isOn3 = false })
        let on2 = Binding<Bool>(get: { self.isOn2 }, set: { self.isOn1 = false; self.isOn2 = $0; self.isOn3 = false })
        let on3 = Binding<Bool>(get: { self.isOn3 }, set: { self.isOn1 = false; self.isOn2 = false; self.isOn3 = $0 })        

        return VStack
            {
                Toggle("T1", isOn: on1)
                Toggle("T2", isOn: on2)
                Toggle("T3", isOn: on3)
        }
    }
}

这个线程很老了,但我在尝试解决同样的问题时遇到了它。 我确实设法使用 .onChange 修饰符自己解决了这个问题。 我对开发很陌生,但我认为这相当优雅。 我的情况只有两个切换,但它也应该适用于三个。

struct SettingsView: View {

    var showFullArray = true
    var showHalfArray = false

    var body: some View {

        VStack {
            Toggle("Show Full Array", isOn: $showFullArray)
                .onChange(of: showFullArray) { newValue in
                    showHalfArray = !newValue
                }
            Toggle("Show Half Array", isOn: $showHalfArray)
                .onChange(of: showHalfArray) { newValue in
                    showFullArray = !newValue
                }
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM