这是我的代码:
struct GameView : View {
@State
private var clicked1 : Bool = false
var body: some View {
HStack {
VStack {
Image("shape0")
.overlay(clicked1 ?
RoundedRectangle(cornerRadius:10)
.stroke(Color.yellow, lineWidth: 7) : pass()
)
.onTapGesure {
print("Image is clicked")
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
但周围发生了一些错误pass()。
clicked1当变量为 时我不想做任何事情false。
我该如何修复它?
.overlay需要一些视图类型作为参数。
如果要使用三元运算符,它必须返回相同的类型。对于“不执行任何操作”视图,请使用EmptyView(),但由于它必须是相同的类型,因此一种方法是将每个条件视图包装为AnyView:
Image("shape0")
.overlay(clicked1
? AnyView(RoundedRectangle(cornerRadius:10)
.stroke(Color.yellow, lineWidth: 7))
: AnyView(EmptyView())
)
Run Code Online (Sandbox Code Playgroud)
编辑:
实际上 -Optional<Wrapped: View>也符合View,所以这是比上面更好的方法 - 即只需返回您想要的视图或nil:
Image("shape0")
.overlay(clicked1 ? RoundedRectangle(cornerRadius:10)
.stroke(Color.yellow, lineWidth: 7) : nil)
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用返回条件视图的计算属性:
var body: some View {
Image("shape0")
.overlay(overlayView)
}
@ViewBuilder
var overlayView: some View {
if clicked1 {
RoundedRectangle(cornerRadius:10)
.stroke(Color.yellow, lineWidth: 7)
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1402 次 |
| 最近记录: |