ios - 有没有办法从 SwiftUI 中的 ButtonStyle 获取 isDisabled 状态?

标签 ios swift swiftui

我正在制作自己的自定义按钮样式以简化按钮的外观和感觉。根据按钮是否被禁用,我想更改外观。我发现能够做到这一点的唯一方法是通过 isDisabled从顶部的属性(property)。有没有办法直接从 ButtonStyle ?

struct CellButtonStyle: ButtonStyle {

    // Passed from the top... can I get this directly from configuration? 
    let isDisabled: Bool

    func makeBody(configuration: Self.Configuration) -> some View {
        let backgroundColor = isDisabled ? Color.white : Color.black
        return configuration.label
            .padding(7)
            .background(isDisabled || configuration.isPressed ? backgroundColor.opacity(disabledButtonOpacity) : backgroundColor)

    }
}
实际的问题是它会导致处理 isDisabled 的代码重复。创建按钮时的标志:
Button {
    invitedContacts.insert(contact.identifier)
} label: {
    Text(invitedContacts.contains(contact.identifier) ? "Invited" : "Invite")
}
// Passing down isDisabled twice! Would be awesome for the configuration to figure it out directly. 
.disabled(invitedContacts.contains(contact.identifier))
.buttonStyle(CellButtonStyle(isDisabled: invitedContacts.contains(contact.identifier)))

最佳答案

您可以使用 isEnabled环境值,但它不能直接在按钮样式中起作用,您需要一些 subview 。这是可能方法的演示(您可以通过构造函数注入(inject)的所有附加参数)
使用 Xcode 12/iOS 14 测试。

struct CellButtonStyle: ButtonStyle {
    
    struct CellBackground: View {
        @Environment(\.isEnabled) var isEnabled       // << here !!
        var body: some View {
            Rectangle().fill(isEnabled ? Color.black : Color.yellow)
        }
    }
    
    func makeBody(configuration: Self.Configuration) -> some View {
        return configuration.label
            .padding(7)
                .background(CellBackground())     // << here !!
    }
}

关于ios - 有没有办法从 SwiftUI 中的 ButtonStyle 获取 isDisabled 状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64254439/

相关文章:

ios - 无法在 Storyboard 上引用 UILabel

ios - 通过 facebook ios SDK 结合 Azure 移动服务获取名字和姓氏

ios - 自动布局与框架尺寸

swift - 仅当触摸位于自定义形状内时,如何使 UIScrollView 可滚动?

SwiftUI 等效 View 优化

ios - 点击列表项时如何显示 View ?

iphone - 是否值得将 JSON 存储到核心数据对象中?

ios - 为什么 UINavigationBarAppearance 有一个 init(idiom :) initializer?

ios - 默认推送 viewController 动画不播放

ios - 带有点按指示的ScrollView中的SwiftUI TapGesture和LongPressGesture不起作用