SwiftUI @State ve .sheet () ios13 vs ios14

Sep 17 2020

Merhaba Burada bir sorunla karşılaşıyorum ve ios13 veya ios14 üzerinde çalışırken .sheet () görünümüm arasında tutarlı bir davranışım yok

Böyle bir görüşüm var:

@State private var label: String = "" 
@State private var sheetDisplayed = false
///Some code
var body: some View {
   VStack {
      Button(action: {
         self.label = "A label"
         self.isDisplayed = true
      }) {
           Text("test")
       }
   }.sheet(isPresented: $sheetDisplayed, onDismiss: {
        self.label = ""
    }) {
        Text(self.label)
       }
 }

İos 13'te bu beklendiği gibi çalışır btn tıklama -> etiketi ayarla -> çağrı sayfası -> Metin görünümünde "A etiketi" görüntüleyin.

İos14'te, sayfa kapanırken self.label'de boş bir dize var, bu nedenle hiçbir şey göstermiyor.

Bir şey mi kaçırdım? Bu bir iOS 14 hatası mı yoksa ios13'te yanlış mı yaptım ve bu düzeltildi.

Not: Kapanışta geçirilen birkaç başka değişkenim var. Onu basitleştirdim.

Yanıtlar

4 Asperi Sep 18 2020 at 03:15

Kodunuzun görünüm güncelleme / oluşturma sırası beklentisi vardır, ancak genel olarak tanımsızdır (ve muhtemelen iOS 14'te değiştirilmiştir).

Sayfanın içine bilgi aktarmanın açık bir yolu vardır - farklı sayfa oluşturucu kullanın, ör. .sheet(item:...

İşte güvenilir bir örnek. Xcode 12 / iOS 14 ile test edildi

struct ContentView: View {
    @State private var item: Item?

    struct Item: Identifiable {
        let id = UUID()
        var label: String = ""
    }

    var body: some View {
        VStack {
            Button(action: {
                self.item = Item(label: "A label")
            }) {
                Text("test")
            }
        }.sheet(item: $item, onDismiss: { self.item = nil }) { Text($0.label)
        }
    }
}
2 Othyn Oct 04 2020 at 21:59

Bu, iOS 14'te belgelenmemiş gibi görünen gerçekten garip bir davranış.

Kullanımı diğer cevabı burada ve üzerinde yorumunu bu iplik , kullandığım @Bindingo en temiz ve en SwiftUI-ulu çözümü gibiydi olarak sorunu çözmek için.

Bu davranışın neden değiştiğine dair hiçbir fikrim yok ve öncekinden daha az sezgisel görünüyor, bu yüzden bunun bir hata olduğunu varsayıyorum!

Bir örnek:

struct MainView: View {
    @State private var message = ""
    @State private var showSheet = false

    var body: some View {
        Button(action: {
            self.message = "This will display the correct message"
            self.showSheet = true
        }, label: {
            Text("Test Button")
        })
        .sheet(isPresented: self.$showSheet) { SheetView(message: self.$message)
        }
    }
}

struct SheetView: View {
    @Binding var message: Int

    var body: some View {
        Text(self.message)
    }
}
valexa Nov 19 2020 at 11:06

SwiftUI 2.0 ile davranış değişti, bu yüzden MacOS 11'i de etkiliyor, sadece görünüme bir bağlama eklemek, bu bağlama hiç kullanılmasa bile onu düzeltir, bu da bana bunun bir uygulama hatası olduğunu düşündürüyor. Ek olarak, yalnızca görünümün gövdesindeki bir Metin () içindeki ayrıntı durumu değişkenini kullanmak da onu düzeltir.

struct MyViewController : View {

    @State var details: String?
    @State var showDetails = false

    //    @Binding var havingAbindingFixesIt: String?

    var body: some View {
        VStack {
            //            Text(details ?? "")
            Text("Tap here for details")
                .onTapGesture {
                    self.details = "These are the details"
                    self.showDetails.toggle()
                }
                .sheet(isPresented: $showDetails) { Text(details ?? "") }
        }
    }
}