SwiftUI @State e .sheet () ios13 contro ios14
Ciao, sto riscontrando un problema qui e non ho un comportamento coerente tra la mia vista .sheet () durante l'esecuzione su ios13 o ios14
Ho una visione come questa:
@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)
}
}
Su iOS 13 funziona come previsto btn fai clic su -> imposta etichetta -> foglio chiamate -> visualizza "A label" in una visualizzazione di testo.
Su iOS14 ho ricevuto una stringa vuota in self.label quando in chiusura foglio, quindi non mostra nulla.
Mi sono perso qualcosa? È un bug di iOS 14 o ho sbagliato su ios13 e questo è stato corretto.
PS: ho un paio di altre variabili che sono passate in chiusura ho semplificato.
Risposte
Il tuo codice ha aspettative di aggiornamento della vista / ordine di creazione, ma in generale non è definito (e probabilmente è cambiato in iOS 14).
C'è un modo esplicito per passare le informazioni all'interno del foglio: usa un creatore di fogli diverso, ad es. .sheet(item:...
Ecco un esempio affidabile funzionante. Testato con Xcode 12 / iOS 14
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)
}
}
}
Questo è un comportamento davvero strano in iOS 14, che non sembra essere documentato.
Usando l' altra risposta qui e il commento su questo thread , ho @Bindingrisolto il problema in quanto sembrava la soluzione più pulita e più SwiftUI-esq.
Non ho idea del perché questo comportamento sia cambiato e sembra meno intuitivo di prima, quindi presumo sia un bug!
Un esempio:
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)
}
}
Il comportamento è cambiato con SwiftUI 2.0, quindi influisce anche su MacOS 11, aggiungendo semplicemente un binding alla vista lo risolve anche quando quel binding non viene mai utilizzato, il che mi fa pensare che si tratti di un bug di implementazione. Inoltre, anche solo l'uso della variabile di stato dei dettagli in un Text () all'interno del corpo della vista lo risolve.
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 ?? "") }
}
}
}