SwiftUI 中 ButtonStyle 的枚举

Alb*_*tUI 5 swift swiftui

可以这样设置按钮样式吗...?

Button() { }
   .buttonStyle(.default)
Run Code Online (Sandbox Code Playgroud)

而不是这个...?

Button() { }
   .buttonStyle(DefaultButtonStyle())
Run Code Online (Sandbox Code Playgroud)

我尝试编写扩展代码,但它不起作用。

extension ButtonStyle {
    static var `default`: DefaultButtonStyle {
        DefaultButtonStyle()
    }
}
Run Code Online (Sandbox Code Playgroud)

它说:Static member 'default' cannot be used on protocol metatype 'ButtonStyle.Protocol'

小智 8

另一个解决方案:

extension ButtonStyle where Self == BorderlessButtonStyle {
    
    internal static var borderless: BorderlessButtonStyle {
        BorderlessButtonStyle()
    }
}
Run Code Online (Sandbox Code Playgroud)

用法:

Button("Demo") {}
    .buttonStyle(.borderless)
Run Code Online (Sandbox Code Playgroud)


Asp*_*eri 7

这是可能方法的演示 - 使用自己的修饰符和自己的枚举,因此可以完全控制一切。

用法

Button("Demo") {}
    .myStyle(.default)
Run Code Online (Sandbox Code Playgroud)

和辅助扩展

enum MyButtonStyle {
    case `default`
    case borderless
    // .. extend with any custom here
}

extension Button {

    @ViewBuilder
    func myStyle(_ style: MyButtonStyle) -> some View {
        switch style {
            case .default:
                self.buttonStyle(DefaultButtonStyle())
            case .borderless:
                self.buttonStyle(BorderlessButtonStyle())
           // .. extend with any custom here
        }
    }
}
Run Code Online (Sandbox Code Playgroud)