【问题标题】:How to restrict content to Text() on custom view/component using ViewBuilder in SwiftUI如何在 SwiftUI 中使用 ViewBuilder 将内容限制为自定义视图/组件上的 Text()
【发布时间】:2020-06-19 18:41:54
【问题描述】:

我使用 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()。有没有办法做到这一点?

提前致谢!

【问题讨论】:

    标签: ios swift iphone swiftui viewbuilder


    【解决方案1】:

    我想将观看次数限制为 1,并且必须 只有文本()。有没有办法做到这一点?

    是的,您不需要为此目的使用泛型,您需要显式指定 Text 并且编译器不会允许其他任何内容,而且 Text 不是容器,所以总是只有一个。

    struct PickerWidget: View {
       var action: () -> Void
       private let content: () -> Text
    
      init(action: @escaping () -> Void, @ViewBuilder content: @escaping () -> Text) {
         ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 2020-12-28
      • 1970-01-01
      • 1970-01-01
      • 2020-07-06
      • 2020-06-09
      • 1970-01-01
      相关资源
      最近更新 更多