我如何知道SwiftUI按钮是否已启用?

时间:2019-07-02 09:14:32

标签: swift swiftui

SwiftUI按钮没有isEnabled属性。我怎么知道它是否启用?

在常规UIKit中,我会简单地做

if button.isEnabeld == true {
} else {
}

但没有等效的SwiftUI。

3 个答案:

答案 0 :(得分:7)

SwiftUI的整个思想是避免重复真理的来源。您需要以不同的方式思考,并考虑真相的来源。这是您需要找出按钮状态的地方。不是来自按钮本身。

在“通过SwiftUI的数据流”中,第30:50分钟,他们解释说每个数据都有一个 单个 事实来源。如果您的按钮从某个@ Binding,@ State,@ EnvironmentObject等获取其状态,则if语句也应该从同一位置而不是从该按钮获取该信息。

答案 1 :(得分:4)

从视图外部,您应该知道是否使用了.disabled(true)修饰符。

在视图内部,您可以使用@Environment(\.isEnabled)来获取该信息:

struct MyButton: View {
    let action: () -> Void
    @Environment(\.isEnabled) private var isEnabled

    var body: some View {
        Button(action: action) {
            Text("Click")
        }
        .foregroundColor(isEnabled ? .green : .gray)
    }
}

struct MyButton_Previews: PreviewProvider {
    static var previews: some View {
        VStack {
            MyButton(action: {})
            MyButton(action: {}).disabled(true)
        }
    }
}

答案 2 :(得分:2)

在视图中,如果您希望对.disabled(true)设置的状态做出反应,则可以使用: @Environment(\.isEnabled) var isEnabled

由于可以在View或ViewModifier中使用环境,因此可以根据外部设置的状态来更改视图的布局属性。

不幸的是,ButtonStyle无法直接使用@Environment,但是您可以使用ViewModifier将环境值注入ButtonStyle中,以便使用{ {1}}:

ButtonStyle

您可以使用此方法将其他内容注入到ButtonStyle中,例如大小类别和主题。

我将其与自定义样式枚举一起使用,该枚举包含在我们的设计系统中找到的所有按钮样式。