SwiftUI 中的 .background() 修饰符中的 .background 出错
`.background` goes wrong in `.background()` modifier in SwiftUI
我正在尝试创建 ButtonStyle
。我想让背景色为Assets.xcassets
中已经创建的buttonBackgroundHover
色,其他时间保持默认背景色(与window的背景色相同)。所以我尝试了下面的代码,但是Xcode说了一个错误:Member 'background(ignoresSafeAreaEdges:)' expects argument of type 'Color'
struct PlayerButton: ButtonStyle {
@State private var isOnHover: Bool = false
func makeBody(configuration: Configuration) -> some View {
configuration.label
.background(isOnHover ? Color("buttonBackgroundHover") : .background)
}
}
但如果我用 .background(.background)
替换 .background(isOnHover ? Color("buttonBackgroundHover") : .background)
,就没有争论了。我想知道这有什么问题,我该如何解决这个问题。非常感谢您的帮助。
没有颜色 Color.background
- 它尝试应用相同的 .background()
修饰符,但在三元运算符中首先是颜色,因此类型冲突 - 错误。
我认为这是预期的
.background(isOnHover ? Color("buttonBackgroundHover") :
Color(uiColor: UIColor.systemBackground)) // << this !!
background
方法声明如下:
func background<S>(_ style: S, ignoresSafeAreaEdges edges: Edge.Set = .all) -> some View where S : ShapeStyle
请注意,它采用的参数类型为 S
,其中 S : ShapeStyle
。当您执行 .background(.red)
或 .background(.background)
时,S
分别为 Color
或 BackgroundStyle
。
然而,当你传入:
isOnHover ? Color("buttonBackgroundHover") : .background
没有一种类型 S
有效。你想让S
是或者Color
或者BackgroundStyle
,但是上面表达式的类型可以只是这些类型中的一种。编译器看到由于 Color("buttonBackgroundHover")
是 Color
类型,它错误地认为您希望第三个操作数 .background
也是 Color
类型。但是没有 Color.background
这样的 属性,但是由于 Color
是一个视图,它也有一个 background
方法,这就是 .background
得到解决的方法到。它需要一个 Color
参数,因为您正在调用没有实例的实例方法 (Color.background
).
无论如何,ShapeStyle
- AnyShapeStyle
有一个类型橡皮擦。应用它使条件表达式的两个分支成为同一类型:
.background(isOnHover ? AnyShapeStyle(Color("buttonBackgroundHover")) : AnyShapeStyle(.background))
我正在尝试创建 ButtonStyle
。我想让背景色为Assets.xcassets
中已经创建的buttonBackgroundHover
色,其他时间保持默认背景色(与window的背景色相同)。所以我尝试了下面的代码,但是Xcode说了一个错误:Member 'background(ignoresSafeAreaEdges:)' expects argument of type 'Color'
struct PlayerButton: ButtonStyle {
@State private var isOnHover: Bool = false
func makeBody(configuration: Configuration) -> some View {
configuration.label
.background(isOnHover ? Color("buttonBackgroundHover") : .background)
}
}
但如果我用 .background(.background)
替换 .background(isOnHover ? Color("buttonBackgroundHover") : .background)
,就没有争论了。我想知道这有什么问题,我该如何解决这个问题。非常感谢您的帮助。
没有颜色 Color.background
- 它尝试应用相同的 .background()
修饰符,但在三元运算符中首先是颜色,因此类型冲突 - 错误。
我认为这是预期的
.background(isOnHover ? Color("buttonBackgroundHover") :
Color(uiColor: UIColor.systemBackground)) // << this !!
background
方法声明如下:
func background<S>(_ style: S, ignoresSafeAreaEdges edges: Edge.Set = .all) -> some View where S : ShapeStyle
请注意,它采用的参数类型为 S
,其中 S : ShapeStyle
。当您执行 .background(.red)
或 .background(.background)
时,S
分别为 Color
或 BackgroundStyle
。
然而,当你传入:
isOnHover ? Color("buttonBackgroundHover") : .background
没有一种类型 S
有效。你想让S
是或者Color
或者BackgroundStyle
,但是上面表达式的类型可以只是这些类型中的一种。编译器看到由于 Color("buttonBackgroundHover")
是 Color
类型,它错误地认为您希望第三个操作数 .background
也是 Color
类型。但是没有 Color.background
这样的 属性,但是由于 Color
是一个视图,它也有一个 background
方法,这就是 .background
得到解决的方法到。它需要一个 Color
参数,因为您正在调用没有实例的实例方法 (Color.background
).
无论如何,ShapeStyle
- AnyShapeStyle
有一个类型橡皮擦。应用它使条件表达式的两个分支成为同一类型:
.background(isOnHover ? AnyShapeStyle(Color("buttonBackgroundHover")) : AnyShapeStyle(.background))