Динамические сборщики SwiftUI в виде сбоя

0

Вопрос

Я начинающий разработчик SwiftUI, и у меня возникли проблемы с созданием представления, которое динамически отображает различные средства выбора на основе предыдущего выбора пользователя в этом представлении. Чтобы увидеть проблему, запустите следующий код в симуляторе, измените выбор выбора на "Выбор три", затем измените его ОБРАТНО на "Выбор два" и попытайтесь изменить выбор выбора. Приложение немедленно завершит работу; конкретная ошибка в этом примере игрушки - "Поток 1: EXC_BAD_ACCESS (код=1, адрес=0x8)". Любое понимание очень приветствуется!

Как в стороне, я бы посмотрел на следующие вопросы: (SwiftUI иерархического выбора с динамическими данными сбои) и (swiftUi : 2 комплектовщики на одном экране - приложение аварии с "индекс вне диапазона"), но если возможно, я хотел бы избежать преобразования моей строки выбора переменных (pickerOneSelection, pickerThreeSelection) в целые числа, которые затем должны быть переведены обратно в строки, чтобы получить текст, связанный с выбора пользователя. Если невозможно сделать то, что я пытаюсь сделать, без переменных индекса, если бы вы могли помочь мне понять, почему, это было бы очень полезно.

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

Большое спасибо за вашу помощь и опыт!

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

Лучший ответ

1

Ключ к проблеме заключается в том, что вы скрываете средство выбора, поэтому лучше всего установить его прозрачность на 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

Спасибо вам за это предложение. К сожалению, это, похоже, не решает проблему. После добавления этого кода в средство выбора Два приложение все равно выйдет из строя, если я изменю выбор средства выбора Один на отображение средства выбора Три, затем снова изменю выбор средства выбора Один на Средство выбора два и попытаюсь изменить выбор средства выбора два. Есть ли что-то еще, что мне нужно сделать в другом месте моего кода, чтобы это решение работало?
ej5607

На других языках

Эта страница на других языках

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