Я структурирован так, чтобы Textfield , кнопка и ViewBuilder Закрытие с названием PickerContent находится в классе TestView . Затем в классе TestViewWithPicker я вызову testView и реализую Picker в своем закрытии PickerContent . Если это кажется запутанной настройкой, это потому, что это MRE реального кода из моего приложения, где это имеет больше смысла. Вот код: < /p>
Код: Выделить всё
import SwiftUI
struct TestView
: View {
@ViewBuilder var additionalEnterButtonDisabledConditions: () -> Bool
@ViewBuilder var pickerContent: () -> PickerContent
@State private var userInput: String = ""
var body: some View {
HStack {
TextField("", text: $userInput)
.textFieldStyle(.roundedBorder)
.padding()
pickerContent()
Button("Enter") {}
.disabled(userInput.isEmpty || additionalEnterButtonDisabledConditions())
.buttonStyle(.borderedProminent)
.padding()
}
}
}
struct TestViewWithPicker: View {
@State private var selectedPickerItem: String? = nil
var body: some View {
TestView(
additionalEnterButtonDisabledConditions: {
return selectedPickerItem == nil
},
pickerContent: {
PickerView(selectedPickerItem: $selectedPickerItem)
}
)
}
}
struct PickerView: View {
@Binding var selectedPickerItem: String?
private let pickerItems: [String] = ["Option A", "Option B", "Option C"]
var body: some View {
Picker("", selection: $selectedPickerItem) {
Text("Select Picker Item").tag(nil as String?)
ForEach(pickerItems, id: \.self) { pickerItem in
Text(pickerItem).tag(pickerItem as String?)
}
}
.pickerStyle(.menu)
.fixedSize(horizontal: true, vertical: true)
}
}
struct HomeView: View {
var body: some View {
TestViewWithPicker()
}
}
Код: Выделить всё
.disabled(self.userInput.isEmpty || self.additionalEnterButtonDisabledConditions())
>
Подробнее здесь: https://stackoverflow.com/questions/796 ... t-updating