SwiftUI Dinamic Culegători în Formă accident

0

Problema

Eu sunt un novice SwiftUI producător, și am probleme în a crea o imagine dinamic prezintă diferite culegătorii pe baza unui utilizator anterior de selecție din acest punct de vedere. Pentru a vedea problema, executați următorul cod în Simulator, schimba pickerOneSelection la "Selector de Trei", apoi schimba-l ÎNAPOI la "Selector de Două" și încercarea de a schimba pickerTwoSelection. Aplicația va prăbuși imediat; specifice de eroare cu această jucărie exemplu este "Filet 1: EXC_BAD_ACCESS (cod=1, adresa=0x8)". Orice înțelegere este cel mai bun venit!

Ca o paranteza, m-am uitat la aceste întrebări: (SwiftUI ierarhic Selector cu date dinamice accidente) și (swiftUi : 2 Culegătorii de pe un singur ecran - app accident cu "Index out of range"), dar dacă este posibil, aș dori să evite transformarea mea șir de selecție variabile (pickerOneSelection, pickerThreeSelection) în numere întregi, care apoi trebuie să fie tradusă în siruri de caractere pentru a obține textul asociat cu selecția utilizatorului. Dacă nu e posibil să facem ceea ce am încercat să fac fără indicelui variabile, dacă mă poți ajuta să înțeleg de ce, că ar fi foarte util.

import SwiftUI

struct ContentView: View {
    @State var pickerOneSelection: String = "Picker Two"
    @State var pickerTwoVisible: Bool = false
    @State var pickerTwoSelection: Int = 3
    @State var pickerThreeSelection: String = "Option 1"
    
    var pickerOneOptions = ["Picker Two", "Picker Three"]
    var pickerThreeOptions = ["Option 1", "Option 2", "Option 3"]
    
    var body: some View {
        NavigationView {
            Form {
                Picker("Picker One selection", selection: $pickerOneSelection) {
                    ForEach(pickerOneOptions, id: \.self) {
                        Text($0)
                    }
                } // End of Picker 1
                
                if pickerOneSelection == "Picker Two" {
                    HStack {
                        Text("Picker Two selection")
                        Spacer()
                        Button(String(pickerTwoSelection)) {
                            self.pickerTwoVisible.toggle()
                        }
                    } // End of HStack
                    
                    if pickerTwoVisible {
                        Picker("Picker Two", selection: $pickerTwoSelection) {
                            ForEach(0..<32, id: \.self) {
                                Text(String($0))
                            }
                        }
                        .pickerStyle(WheelPickerStyle())
                    } // End of pickerTwoVisible
                    
                } else {
                    
                    Picker("Picker Three selection", selection: $pickerThreeSelection) {
                        ForEach(pickerThreeOptions, id: \.self) {
                            Text($0)
                        }
                    } // End of Picker 3
                    
                }
            } // End of Form
        } // End of NavigationView
    } // End of body
} // End of ContentView

Multe mulțumiri pentru ajutorul și expertiza!

picker swiftui xcode
2021-11-23 13:46:55
1

Cel mai bun răspuns

1

Cheia problemei este că vă ascundeți picker, deci este mai bine pentru a seta transparența la 0

Picker("Picker Two", selection: $pickerTwoSelection) {
                            ForEach(1..<32, id: \.self) {
                                Text(String($0))
                            }
                        }
                        .pickerStyle(WheelPickerStyle())
                        .opacity(pickerTwoVisible ? 1 : 0)
                        .frame(width: pickerTwoVisible ? nil : 0, height: pickerTwoVisible ? nil : 0)
2021-11-23 14:25:11

Vă mulțumesc pentru această sugestie. Din păcate, nu pare să rezolve problema. După adăugarea acest cod pentru a Selector de Două, aplicația se blochează încă dacă am schimba Selectorul de O selectie pentru a afișa Selectorul de Trei, apoi schimba Selectorul de O selectie înapoi la Selectorul de Două și încercarea de a schimba Selectorul de Două selecție. Mai e ceva ce trebuie să fac în altă parte în codul meu pentru a face acest lucru soluție?
ej5607

În alte limbi

Această pagină este în alte limbi

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................