如何在 SwiftUI 中检测空内容作为输入内容?

use*_*ser 5 swift swiftui

我有一个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)

New*_*Dev 3

您可以useHStackinit() 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)