如何在SwiftUI中使用ViewBuilder将内容限制为自定义视图/组件上的Text()

时间:2020-03-07 03:13:43

标签: ios swift iphone swiftui viewbuilder

我已经使用SwiftUI创建了一个自定义组件。它类似于一个类似于文本字段的下拉列表,但是当您点击它时,它将显示一个包含选项列表的工作表。这是选择器的代码:

struct PickerWidget<Content: View>: View{
var action: () -> Void
private let content: () -> Content

init(action: @escaping () -> Void, @ViewBuilder content: @escaping () -> Content) {
    self.content = content
    self.action = action
}

var body: some View {
    Button(action: {
        self.action()
    })
    {
        HStack{
            content()
                .frame(minWidth: 0, maxWidth: .infinity, alignment: .leading)
                .foregroundColor(Color.black)
            Image(systemName: "chevron.down")
        }
        .padding()
        .overlay(
            RoundedRectangle(cornerRadius: 10)
                .stroke(Color.gray, lineWidth: 1)
        )
    }
    .padding()
}

}

这是在父视图中使用它的方式:

        PickerWidget(action: { self.isSheetShown.toggle() }){
            Text("US Dollars (USD)")
        }
        .sheet(isPresented: $isSheetShown){
            CurrencyPickerView(isSheetShown: self.$isSheetShown)
        }

它完美地工作。但是我想将视图的数量限制为1,并且只能是Text()。有办法吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

我想将视图数量限制为1,因此必须 只能是Text()。有办法吗?

是的,您无需为此使用泛型,您需要明确指定Text,并且编译器将不允许其他任何操作,并且Text不是容器,因此始终只是一个容器。

struct PickerWidget: View {
   var action: () -> Void
   private let content: () -> Text

  init(action: @escaping () -> Void, @ViewBuilder content: @escaping () -> Text) {
     ...