Как ограничить контент Text() в пользовательском представлении / компоненте с помощью ViewBuilder в SwiftUI
Я создал собственный компонент с помощью 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 ответ
Решение
Я хотел бы ограничить количество просмотров до одного, и это должен быть ТОЛЬКО Text(). Есть ли способ сделать это?
Да, для этой цели вам не нужны дженерики, вам нужно явно указать текст, и компилятор не разрешит ничего другого, а текст не является контейнером, поэтому всегда будет только один.
struct PickerWidget: View {
var action: () -> Void
private let content: () -> Text
init(action: @escaping () -> Void, @ViewBuilder content: @escaping () -> Text) {
...