Dynamiczne zbieracze SwiftUI w postaci awarii

0

Pytanie

Jestem początkujący programista SwiftUI, i mam problemy z tworzeniem prezentacji, która dynamicznie wyświetla różne środki wyboru na podstawie poprzedniego wyboru użytkownika w tym widoku. Aby zobaczyć problem, uruchom następujący kod w symulatorze, zmień wyboru na "trzy", a następnie zmienić go z POWROTEM na "dwa" i spróbuj zmienić wybór wyboru. Aplikacja natychmiast zakończy pracę; konkretny błąd w tym przykładzie zabawek - "Strumień 1: EXC_BAD_ACCESS (kod=1, adres=0x8)". Wszelkie zrozumienie jest bardzo mile widziane!

Tak na marginesie, ja bym spojrzał na następujące pytania: (SwiftUI hierarchii wyboru z dynamicznymi danymi się zawiesza) i (swiftUi : 2 комплектовщики na jednym ekranie - aplikacja wypadku z "indeks jest spoza zakresu"), ale jeśli to możliwe, chciałbym uniknąć konwersji mojego wiersza wyboru zmiennych (pickerOneSelection, pickerThreeSelection) w liczby, które następnie muszą być przeniesione z powrotem do wiersza, aby uzyskać tekst, związany z wyboru użytkownika. Jeśli nie można zrobić to, co staram się zrobić, bez zmiennych indeksu, jeśli mógłbyś mi pomóc zrozumieć, dlaczego, to byłoby to bardzo przydatne.

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

Bardzo dziękuję za waszą pomoc i doświadczenie!

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

Najlepsza odpowiedź

1

Klucz do problemu polega na tym, że ukrywa się narzędzie wyboru, dlatego najlepiej ustawić przezroczystość 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

Dziękuję ci za tę propozycję. Niestety, to, jak się wydaje, nie rozwiązuje problemu. Po dodaniu tego kodu w narzędzie do wyboru Dwa aplikacja i tak wyjdzie z komisji, jeśli zmienię wybór narzędzia wyboru Jeden na wyświetlanie selektora Trzy, a następnie ponownie zmienię wybór narzędzia wyboru Jeden na Środek wyboru dwa i postaram się zmienić wybór narzędzia do wyboru dwa. Czy jest coś jeszcze, co muszę zrobić w innym miejscu mojego kodu, aby to rozwiązanie działało?
ej5607

W innych językach

Ta strona jest w innych językach

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