【问题标题】:How to change the label of a button by using an if statement in SwiftUI如何在 SwiftUI 中使用 if 语句更改按钮的标签
【发布时间】:2021-02-19 00:17:28
【问题描述】:

我希望我的按钮在按下按钮后看起来有所不同。我试图通过使用 ZStack 和 if 语句来做到这一点。我不明白为什么它不会在黑色按钮和白色按钮之间切换......我正在获得使用 ObservableObject 协议的经验。

class WelcomeButton: ObservableObject {
    @Published var hasBeenPressed = false
}

struct WelcomeScreenButton: View {
    @ObservedObject var welcomeButton = WelcomeButton()
    
    var body: some View {
        ZStack {
            if welcomeButton.hasBeenPressed {
                Circle()
                    .fill(Color(.white))
            }
            else {
                Circle()
                    .fill(Color(.black))
            }
        }
    }
}

struct ContentView: View {
    @ObservedObject var welcomeButton = WelcomeButton()
    
    var body: some View {
        VStack {
            Button(action: {welcomeButton.hasBeenPressed.toggle()})
            {
                WelcomeScreenButton()
            }
            .frame(width: 375, height: 375, alignment: .center)
        }
    }
}

【问题讨论】:

    标签: ios swift if-statement button swiftui


    【解决方案1】:

    您非常接近,但您必须在两者之间共享相同的 WelcomeButton ObservableObject 实例。现在,它们是两个独立的实例,因此当您在其中一个上更新 hasBeenPressed 时,另一个不知道要更改其状态。

    struct WelcomeScreenButton: View {
        @ObservedObject var welcomeButton : WelcomeButton //<-- here
        
        var body: some View {
            ZStack {
                if welcomeButton.hasBeenPressed {
                    Circle()
                        .fill(Color(.white))
                }
                else {
                    Circle()
                        .fill(Color(.black))
                }
            }
        }
    }
    
    struct ContentView: View {
        @ObservedObject var welcomeButton = WelcomeButton()
        
        var body: some View {
            VStack {
                Button(action: {welcomeButton.hasBeenPressed.toggle()})
                {
                    WelcomeScreenButton(welcomeButton: welcomeButton) //<-- here
                }
                .frame(width: 375, height: 375, alignment: .center)
            }
        }
    }
    

    PS -- 作为一般做法,最好让命名稍有不同以保持直截了当。 WelcomeButton 听起来像是一个按钮。将其命名为 WelcomeButtonViewModel 会使其意图更加明确,尽管它根本不会改变功能。

    【讨论】:

    • 谢谢!我一直试图弄清楚它太久了。这让我继续学习:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 1970-01-01
    相关资源
    最近更新 更多