SwiftUI Dinâmica de Catadores de Forma acidente

0

Pergunta

Eu sou um novato SwiftUI desenvolvedor, e eu estou tendo problemas para criar um modo de exibição que dinamicamente apresenta diferentes catadores baseado em um usuário anterior de selecção no modo de exibição. Para ver o problema, execute o seguinte código no Simulador, alterar o pickerOneSelection para "Seletor de Três" e, em seguida, mudar NOVAMENTE para "Selecionador de Dois" e tentar alterar o pickerTwoSelection. O aplicativo será imediatamente acidente; o erro específico com este brinquedo exemplo é "Thread 1: EXC_BAD_ACCESS (código=1, address=0 x 8)". Qualquer insight que é mais bem-vindo!

Como um aparte, eu olhei para as seguintes perguntas: (SwiftUI hierárquica Seletor com dados dinâmicos falha) e (swiftUi : 2 Colectores em uma tela aplicativo falha com "Índice fora do intervalo"), mas, se possível, eu gostaria de evitar a conversão de meu seqüência de seleção de variáveis (pickerOneSelection, pickerThreeSelection) em números inteiros, que deve, então, ser traduzido de volta para seqüências para obter o texto associado com a seleção do usuário. Se não é possível fazer o que eu estou tentando fazer sem o índice de variáveis, se você pudesse me ajudar a entender por que seria muito útil.

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

Muito obrigado pela sua ajuda e a experiência!

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

Melhor resposta

1

A chave para o problema é que você ocultar o selecionador, então é melhor definir sua transparência para 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

Obrigado por esta sugestão. Infelizmente, ele não parece resolver o problema. Depois de adicionar este código ao Selecionador Dois, o app ainda falha se eu mudar o Seletor de Uma seleção para exibir o Seletor de Três, em seguida, altere o Seletor de Uma selecção para o Selecionador de Dois e tentar mudar o Seletor de Dois seleção. Há mais alguma coisa que eu preciso fazer em outro lugar no meu código para fazer com que esta solução funciona?
ej5607

Em outros idiomas

Esta página está em outros idiomas

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