我需要一些有关小型 SwiftUI 视图逻辑的帮助

问题描述 投票:0回答:1

我的视图有 3 个开关和 1 个按钮。一开始,所有开关都是假的,你只能将一个开关设为真。此外,该按钮仅在

customOption
newCustomOption
之间存在差异时才起作用。

在 4 种可能的情况下,只有 2 种适用于我当前的代码:

1- 首先打开所有开关

false
,打开一个
true
并确认。好的

2- 您一开始只打开一个开关

true
,使其
false
并确认。好的

3- 首先将所有开关打开

false
,制作一个
true
,制作另一个
true
,然后您会得到
None
,而不是对应的值。不行

4- 与 3 类似,但您已经打开了一个开关

true
。不行

我发现了问题:在获得正确的值后,

newCustomOption
设置为
None
,而不是相反,但我不知道如何解决它。有什么想法吗?

import SwiftUI

struct ExampleView: View {
    @Environment(\.dismiss) private var dismiss
    @AppStorage("customOption") private var customOption = "None"
    @State private var newCustomOption = "None"
    @State private var optionOne = false
    @State private var optionTwo = false
    @State private var optionThree = false

    var body: some View {
        VStack {
            Toggle("Option One", isOn: $optionOne)
                .onAppear { load() }
                .onChange(of: optionOne) { _ in
                    newCustomOption = optionOne ? "optionOne" : "None"
                    print(newCustomOption)
                    if optionOne {
                        optionTwo = false
                        optionThree = false
                    }
                }
            Toggle("Option Two", isOn: $optionTwo)
                .onChange(of: optionTwo) { _ in
                    newCustomOption = optionTwo ? "optionTwo" : "None"
                    print(newCustomOption)
                    if optionTwo {
                        optionOne = false
                        optionThree = false
                    }
                }
            Toggle("Option Three", isOn: $optionThree)
                .onChange(of: optionThree) { _ in
                    newCustomOption = optionThree ? "optionThree" : "None"
                    print(newCustomOption)
                    if optionThree {
                        optionOne = false
                        optionTwo = false
                    }
                }
            Button("Confirm", action: { confirm() })
                .opacity(customOption == newCustomOption ? 0.5 : 1)
                .disabled((customOption == newCustomOption ? true : false))
        }
    }

    private func load() {
        newCustomOption = customOption
        switch newCustomOption {
        case "optionOne":
            optionOne = true
        case "optionTwo":
            optionTwo = true
        case "optionThree":
            optionThree = true
        default /* "None" */:
            return
        }
    }

    private func confirm() {
        customOption = newCustomOption
        dismiss()
    }
}

提前谢谢!

swift swiftui switch-statement
1个回答
0
投票

我建议您使用

Picker
并将其样式设置为单选按钮组,它将需要更少的代码和更简单的逻辑

struct ExampleView: View {
    @Environment(\.dismiss) private var dismiss
    @AppStorage("customOption") private var customOption = "None"

    var body: some View {
        VStack {
            Picker(selection: $customOption, label: Text("Option:")) {
                Text("One").tag("optionOne")
                Text("Two").tag("optionTwo")
                Text("Three").tag("optionThree")
                Text("None").tag("None")
            }.pickerStyle(RadioGroupPickerStyle())

            Button("Dismiss") { dismiss() }
        }
    }
}

下一步是使用枚举来保存不同的选项。

© www.soinside.com 2019 - 2024. All rights reserved.