我有一个CustomView,它有一个简单的逻辑!如果这个CustomView得到一个非 EmptyView 应该返回一个 HStack,如果这个CustomView得到一个 EmptyView 应该返回一个 Circle,我如何根据输入内容找到正确的选项?
例如它应该像这样工作: 但事实并非如此!我必须对你在下面看到的结果进行硬编码 true 或 false
CustomView() { Text("Hello") }.background(Color.red).padding()
Run Code Online (Sandbox Code Playgroud)
CustomView().background(Color.red)
Run Code Online (Sandbox Code Playgroud)
目标:useHStack这个问题尝试找到一个答案,根据输入内容设置正确的值!
PS:逻辑上有一种方法可以用作CustomViewuseHStack的参数,在这种情况下就没有必要问这个问题了!因此,我们正在尝试解决问题,而不使用CustomView或任何其他参数作为输入参数!我喜欢在 CustomView 初始化时进行检测,而不是在正文中或通过 GeometryReader 等进行检测。。。useHStack
我的问题是,useHStack根据传入的内容,我如何知道何时必须为真或为假! 传入内容意味着来自示例:Text("Hello")
import SwiftUI
struct ContentView: View {
var body: some View {
CustomView() { Text("Hello") }
CustomView()
}
}
struct CustomView<Content: View>: View {
let content: () -> Content
let useHStack: Bool
init(@ViewBuilder content: @escaping () -> Content) {
self.content = content
self.useHStack = true // or: false depending on content(), if we got EmptyView() then false otherwise true! the idea is make this part Automatic!
}
init() where Content == EmptyView {
self.init(content: { EmptyView() })
}
var body: some View {
if useHStack {
HStack {
content()
Spacer()
Circle().frame(width: 50, height: 50, alignment: .center)
}
}
else {
Circle().frame(width: 50, height: 50, alignment: .center)
}
}
}
Run Code Online (Sandbox Code Playgroud)
您可以useHStack在init() where Content == EmptyView. 您要么需要制作它var useHStack: Bool,要么创建一个private init:
private init(content: @escaping () -> Content, useHStack: Bool) {
self.content = content
self.useHStack = useHStack
}
init(@ViewBuilder content: @escaping () -> Content) {
self.init(content: content, useHStack: true)
}
init() where Content == EmptyView {
self.init(content: { EmptyView() }, useHStack: false)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1916 次 |
| 最近记录: |