Updated for Xcode 13.3
New in iOS 14
If you want to save unique data for each of your screens, you should use SwiftUI’s @SceneStorage
property wrapper. This works a bit like @AppStorage
in that you provide it with a name to save things plus a default value, but rather than working with UserDefaults
it instead gets used for state restoration – and it even works great with the kinds of complex multi-scene set ups we see so often in iPadOS.
For example, if you have a text editor and want to store what the user was typing, you should use this kind of code:
struct ContentView: View {
@SceneStorage("text") var text = ""
var body: some View {
NavigationView {
TextEditor(text: $text)
}
.navigationViewStyle(.stack)
}
}
Note: I’ve used .stack
there because it forces the iPad to allocate all the space to our text editor. If you’re using Xcode 12, you need to use StackNavigationViewStyle
to get the same result.
Because that uses @SceneStorage
, SwiftUI will automatically make sure that each scene instance has its own copy of the text – if you run the app side by side both will save and restore their data correctly.
Now, before you use @SceneStorage
there are some important warnings from Apple:
SPONSORED Fernando's book will guide you in fixing bugs in three real, open-source, downloadable apps from the App Store. Learn applied programming fundamentals by refactoring real code from published apps. Hacking with Swift readers get a $10 discount!
Sponsor Hacking with Swift and reach the world's largest Swift community!
Link copied to your pasteboard.