斯威夫特。单击后如何永久更改按钮的颜色?

Posted

技术标签:

【中文标题】斯威夫特。单击后如何永久更改按钮的颜色?【英文标题】:SWIFTUI. How to permanently change the color of the buttons after clicking? 【发布时间】:2019-10-26 23:33:30 【问题描述】:

我正在构建一个测验应用程序。一个问题; 3个答案。答案位于单独的按钮中。

我管理了单击时更改按钮的颜色。例如从灰色到绿色/红色。但点击后按钮变回灰色。

有没有办法在点击后保留更改的颜色,比如 html 中的超链接?

这是样式代码:

struct MyButtonStyle: ButtonStyle 

  func makeBody(configuration: Self.Configuration) -> some View 
    configuration.label
      .padding(20)
      .foregroundColor(.white)
      .background(configuration.isPressed ? Color.red : Color.gray)
      .cornerRadius(10.0)

【问题讨论】:

【参考方案1】:

您可以像这样声明您的 ButtonStyle:

public struct SelectedButtonStyle: ButtonStyle 

    @Binding var isSelected: Bool

    public func makeBody(configuration: Self.Configuration) -> some View 
        configuration.label
            .padding(20)
            .foregroundColor(.white)
            .background(isSelected ? Color.red : Color.gray)
            .cornerRadius(10.0)
    

然后在视图中,为选择设置一个状态:

@State var isSelected = false

然后您可以像这样声明您的按钮,使其被选中一次并永远保持选中状态:

Button("Tap") 
    self.isSelected = true
   .buttonStyle(SelectedButtonStyle(isSelected: $isSelected))

或者你可以这样声明它也可以取消选择它:

Button("Tap") 
    self.isSelected.toggle()
   .buttonStyle(SelectedButtonStyle(isSelected: $isSelected))

【讨论】:

【参考方案2】:

尝试这样的操作,一旦isPressed 变为true 它就不会再次变为假,所以按钮将保持灰色

struct ContentView: View 

   @State private var isPressed = false

    var body: some View 
        Button(action: 
            self.isPressed = true
        , label: 
            Text("Button").accentColor(isPressed ? Color.gray : Color.blue)
        )
    

【讨论】:

我试过了,但是点击后颜色又变回来了。感谢您的努力。 @IrfanKaya 你试过这个代码吗?再次点击按钮时isPressed不会变成false,所以颜色不会改变 我不知道为什么,但我无法让它工作。我对这些东西很陌生,所以也许还有其他代码可以做到这一点。 使用self.isPressed.toggle()

以上是关于斯威夫特。单击后如何永久更改按钮的颜色?的主要内容,如果未能解决你的问题,请参考以下文章

单击后按钮更改颜色 - 焦点无法正常工作

如何在单击按钮后写入文件

Angular - 单击按钮后更改表中行的背景颜色

使按钮的背景颜色在单击后更改并保持不变

单击时如何更改按钮的颜色,并在下次单击时恢复为默认颜色?

如何在更改 UIView 大小时应用动画? + 斯威夫特 5