【发布时间】:2022-01-12 03:45:30
【问题描述】:
SwiftUI 有一些 Button 初始化器,但它们都需要 String 或 some View 作为参数以及 action。
不过,按钮的外观也可以在ButtonStyles 的帮助下进行自定义,ButtonStyles 可以为其添加自定义视图。
让我们考虑一个带有以下图标的复制按钮:
我为按钮制作的样式如下:
struct CopyButtonStyle: ButtonStyle {
init() {}
func makeBody(configuration: Configuration) -> some View {
let copyIconSize: CGFloat = 24
return Image(systemName: "doc.on.doc")
.renderingMode(.template)
.resizable()
.frame(width: copyIconSize, height: copyIconSize)
.accessibilityIdentifier("copy_button")
.opacity(configuration.isPressed ? 0.5 : 1)
}
}
它工作得很好,但是,我必须在调用站点用一个空字符串初始化Button:
Button("") {
print("copy")
}
.buttonStyle(CopyButtonStyle())
那么,问题是如何去掉按钮初始化参数中的空字符串?
可能的解决方案
我能够创建一个简单的扩展来完成我需要的工作:
import SwiftUI
extension Button where Label == Text {
init(_ action: @escaping () -> Void) {
self.init("", action: action)
}
}
调用站点:
Button() { // Note: no initializer parameter
print("copy")
}
.buttonStyle(CopyButtonStyle())
但很好奇,我是否错误地使用了 Button 结构并且已经有一个用例,所以我可以摆脱这个扩展。
【问题讨论】: