Eu tenho o ImportDataView principal com uma lista de alguns selecionadores. Os selecionadores são semelhantes, mas preciso usar uma "seleção" diferente. Cada selecionador está em uma var separada (alguma visualização) da extensão ImportDataView. É possível usar uma visualização do seletor em vez de 3 (ou mais) e passar/vincular diferentes variáveis de "seleção" (de ImportDataViewModel)?
Desde já, obrigado.
import SwiftUI
class ImportDataViewModel: ObservableObject {
@Published var field1Index: Int?
@Published var field2Index: Int?
@Published var fieldNIndex: Int?
func getFieldNamesFromCSV() -> [String] {
return ["fieldFromFile1", "fieldFromFile2", "fieldFromFileN"]
}
}
struct ImportDataView: View {
@Environment(\.dismiss) var dismiss
@EnvironmentObject var itVM: ImportDataViewModel
var body: some View {
NavigationView {
List {
HStack {
Text("Field 1 *")
Spacer()
chooseField1View
}
HStack {
Text("Field 2 *")
Spacer()
chooseField2View
}
HStack {
Text("Field N *")
Spacer()
chooseFieldNView
}
}
.toolbar {
ToolbarItem(placement: .cancellationAction) {
Button("Back", role: .cancel) {
dismiss()
}
}
}
}
}
}
extension ImportDataView {
@ViewBuilder
private var chooseField1View: some View {
Picker(selection: $itVM.field1Index, label: EmptyView()) {
ForEach(itVM.getFieldNamesFromCSV().indices, id: \.self) { index in
Text(itVM.getFieldNamesFromCSV()[index]).tag(index as Int?)
}
}
}
@ViewBuilder
private var chooseField2View: some View {
Picker(selection: $itVM.field2Index, label: EmptyView()) {
ForEach(itVM.getFieldNamesFromCSV().indices, id: \.self) { index in
Text(itVM.getFieldNamesFromCSV()[index]).tag(index as Int?)
}
}
}
@ViewBuilder
private var chooseFieldNView: some View {
Picker(selection: $itVM.fieldNIndex, label: EmptyView()) {
ForEach(itVM.getFieldNamesFromCSV().indices, id: \.self) { index in
Text(itVM.getFieldNamesFromCSV()[index]).tag(index as Int?)
}
}
}
}
struct ImportDataView_Previews: PreviewProvider {
static var previews: some View {
ImportDataView()
.environmentObject(ImportDataViewModel())
.preferredColorScheme(.light)
}
}
Eu uso a variável "some View" separada para cada selecionador, mas entendo que é o caminho errado ao copiar/colar.
Espero ter apenas uma extensão "comum" var "some View" e usá-la para todos os campos de importação como este:
HStack {
Text("Field 1 *")
Spacer()
chooseFieldCommonView(selectionFieldIndex: $itVM.field1Index)
}
HStack {
Text("Field 2 *")
Spacer()
chooseFieldCommonView(selectionFieldIndex: $itVM.field2Index)
}
HStack {
Text("Field N *")
Spacer()
chooseFieldCommonView(selectionFieldIndex: $itVM.fieldNIndex)
}
Divida o ChooseFieldView em um novo arquivo com a entrada sendo o índice (que se liga ao modelo de visualização externo) e a matriz de strings como conteúdo
Então
ImportDataView
edite assim:Resultado: