SwiftUI Dynamique Cueilleurs en Forme de crash

0

La question

Je suis un novice SwiftUI développeur, et je vais avoir de la difficulté à la création d'un affichage dynamique qui présente les différents sélecteurs de fonction d'un utilisateur sélection précédente de ce point de vue. Pour voir le problème, exécutez le code suivant dans le Simulateur, changer la pickerOneSelection à "Sélecteur de Trois", puis REVENIR à "Sélecteur de Deux" et tenter de changer le pickerTwoSelection. L'application va immédiatement tomber en panne et l'erreur spécifique avec ce jouet exemple est "Thread 1: EXC_BAD_ACCESS (code=1, address=0x8)". Toute idée est la bienvenue!

En aparté, j'ai regardé ces questions: (SwiftUI hiérarchique Sélecteur avec des données dynamiques se bloque) et (swiftUi : 2 préparateurs de sur un écran de l'application crash avec "Index out of range"), mais si possible, j'aimerais éviter de convertir ma chaîne de sélection de variables (pickerOneSelection, pickerThreeSelection) en nombres entiers, qui doit ensuite être traduit dans des chaînes pour obtenir le texte associé à la sélection de l'utilisateur. Si il n'est pas possible de faire ce que j'essaie de faire sans les variables de l'indice, si vous pouviez m'aider à comprendre pourquoi, ce serait très utile.

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

Merci beaucoup pour votre aide et votre expertise!

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

La meilleure réponse

1

La clé du problème, c'est que vous masquer le sélecteur, il est préférable de régler sa transparence à 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

Merci pour cette suggestion. Malheureusement, il ne semble pas résoudre le problème. Après l'ajout de ce code de Sélecteur de Deux, l'application se bloque toujours si je change le Sélecteur de sélection pour afficher le Sélecteur de Trois, puis de changer le Sélecteur de Une sélection à Sélecteur de Deux et d'essayer de changer le Sélecteur de Deux de sélection. Est-il autre chose que je dois faire, d'ailleurs dans mon code pour que cette solution fonctionne?
ej5607

Dans d'autres langues

Cette page est dans d'autres langues

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