SwiftUI Dynamické Sběrači v Podobě havárie

0

Otázka

Jsem nováček SwiftUI developer, a mám problém vytvoření zobrazení, které dynamicky představuje různé sběrači na základě předchozí výběr uživatele v prohlížení. Vidět problém, spusťte následující kód v Simulátoru, změnit pickerOneSelection, aby "Picker Tři", pak jej změnit ZPĚT na "Výběr Dva" a pokus o změnu pickerTwoSelection. Aplikace bude okamžitě zhroutí; konkrétní chyby s touto hračkou příkladem je "Závitu 1: EXC_BAD_ACCESS (kód=1, address=0x8)". Žádné pochopení, je velmi vítaná!

Jako stranou, díval jsem se na tyto otázky: (SwiftUI hierarchické Sběrač s dynamic data pády) a (swiftUi : 2 Sběrače na jedné obrazovce - app havárie s "Index out of range"), ale pokud je to možné, rád bych, aby se zabránilo konverzi můj výběr řetězec proměnné (pickerOneSelection, pickerThreeSelection) na celá čísla, která pak musí být přeloženy zpět do řetězce, aby se text asociovaný s uživateli na výběr. Pokud to není možné, aby to, co se snažím dělat bez indexu proměnné, pokud byste mi mohl pomoci pochopit, proč, to by bylo velmi užitečné.

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

Mnohokrát děkuji za vaši pomoc a odborné znalosti!

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

Nejlepší odpověď

1

Klíč k problému je, že můžete skrýt výběr, takže to je nejlepší nastavit jeho průhlednost na 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

Děkuji za tento návrh. Bohužel, nezdá se, že vyřešit problém. Po přidání tohoto kódu na Výběr Dva, aplikace stále havaruje, když změním Picker Jeden výběr se zobrazí Výběr Tři, pak změnit Picker Jeden výběr zpět na Výběr Dva, a pokusí se změnit Picker pro výběr Dvou. Je tu něco, co musím udělat jinde v mém kódu, aby se toto řešení funguje?
ej5607

V jiných jazycích

Tato stránka je v jiných jazycích

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