SwiftUI图像作为自定义“单选”按钮

时间:2019-11-02 23:27:49

标签: ios swift swiftui

我想要一个带有一些预定义颜色的简单拾色器。用户应该只能选择一种颜色。

它应该像“无线电”输入一样工作,当选择一种颜色时,取消选中另一种颜色。

我决定一种不错的方法是让图像使用系统“ circle.fill”和“ checkmark.circle.fill”作为所选项目。我只需将每个foregroundColor设置为其相应的.color

尽管如此,我还是很费解。我知道我可以为图像本身创建一个简单的View并将.color传递给每个图像,但是我将如何确保一次仅“检查” 1张图像,并从“ checked”中获取值图片,以便可以将其传递给Core Data?

我猜我可以使用状态$var发生变化的状态,但是当选择一个状态后如何取消选择所有其他图像?我应该将图像放入数组还是其他东西?我迷路了。

2 个答案:

答案 0 :(得分:0)

将所选索引存储在@State变量中。显示行时,请检查当前行索引是否为选定的索引,如果是,则使用对勾标记图像,否则使用圆圈。

答案 1 :(得分:0)

您正在考虑正确的方法,但是需要使用accentColor更改颜色,因为这是更改按钮颜色的方法:

首先定义一个CheckBox,该复选框将使用一种颜色初始化,并且还将绑定到其父视图的所选颜色。

struct CheckBox: View {

    @Binding var selectedColor: Color?
    var color: Color

    var body: some View {
        Button(action: { self.selectedColor = self.color }) {
            Image(systemName: self.selectedColor == color ? "checkmark.circle.fill" : "circle.fill")
        }   .accentColor(self.color)
    }
}

点击按钮会将按钮的颜色设置为其父视图中的选定颜色。 接下来,您需要将CheckBoxes分组到另一个视图中,该视图将所选颜色保留为其状态:

struct RadioButtons: View {

    let colors: [Color] = [.purple,
                           .red,
                           .orange,
                           .yellow,
                           .green,
                           .blue]

    @State var selectedColor: Color?

    var body: some View {
        HStack {
            ForEach(colors, id:  \.description) { color in
                CheckBox(selectedColor: self.$selectedColor, color: color)
            }
        }
    }
}

这里是:

radio buttons