Как ограничить содержимое Text () в пользовательском представлении / компоненте, используя ViewBuilder в SwiftUI - PullRequest
1 голос
/ 07 марта 2020

Я создал пользовательский компонент, используя 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 голосов
/ 07 марта 2020

Я хотел бы ограничить количество просмотров только 1, и оно должно быть ТОЛЬКО Text (). Есть ли способ сделать это?

Да, для этого вам не нужны универсальные шаблоны, вам нужно явно указывать Text, и компилятор больше ничего не разрешит, а Text не является контейнером, так всегда будет только один.

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

  init(action: @escaping () -> Void, @ViewBuilder content: @escaping () -> Text) {
     ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...