Form çökmesinde SwiftUİ Dinamik Toplayıcıları

0

Soru

Acemi bir SwiftUİ geliştiricisiyim ve bir kullanıcının bu görünümdeki önceki seçimine göre dinamik olarak farklı seçiciler sunan bir görünüm oluşturmakta sorun yaşıyorum. Sorunu görmek için Simülatörde aşağıdaki kodu çalıştırın, pickerOneSelection öğesini "Picker Three" olarak değiştirin, ardından "Picker Two" olarak değiştirin ve pickerTwoSelection öğesini değiştirmeye çalışın. Uygulama hemen çökecek; Bu oyuncak örneğindeki özel hata "İş Parçacığı 1: EXC_BAD_ACCESS (kod=1, adres=0x8)" dir. Herhangi bir anlayış en açığız!

Olarak bir kenara, ben baktım bu sorular: (SwiftUİ hiyerarşik Seçici ile dinamik veri çöker) ve (swiftUi : 2 Toplayıcılar üzerinde bir ekran - app crash ile "Index out of range"), ama mümkünse istiyorum dönüştürme önlemek için benim dize seçimi değişkenleri (pickerOneSelection, pickerThreeSelection) içine tamsayılar, hangi gerekir o zaman geri çevrilir içine dizeleri olsun metni ile ilgili kullanıcı seçimi. Endeks değişkenleri olmadan yapmaya çalıştığım şeyi yapmak mümkün değilse, nedenini anlamama yardımcı olabilirseniz, bu çok yardımcı olacaktır.

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

Yardımlarınız ve uzmanlığınız için çok teşekkürler!

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

En iyi cevabı

1

Sorunun anahtarı, seçiciyi gizlemenizdir, bu nedenle saydamlığını 0 olarak ayarlamak en iyisidir

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

Bu öneri için teşekkür ederiz. Ne yazık ki, bu sorunu çözmüyor gibi görünüyor. Bu kodu Seçici İki'ye ekledikten sonra, Seçici Bir seçimi Seçici Üç'ü gösterecek şekilde değiştirirsem, ardından Seçici Bir seçimi Seçici İki'ye geri döndürürsem ve Seçici İki seçimini değiştirmeye çalışırsam uygulama yine de çöker. Bu çözümün çalışması için kodumun başka bir yerinde yapmam gereken başka bir şey var mı?
ej5607

Diğer dillerde

Bu sayfa diğer dillerde

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