Updated for Xcode 12.5
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(StackNavigationViewStyle())
}
}
Note: I’ve used StackNavigationViewStyle
there because it forces the iPad to allocate all the space to our text editor.
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 Building and maintaining in-app subscription infrastructure is hard. Luckily there's a better way. With RevenueCat, you can implement subscriptions for your app in hours, not months, so you can get back to building your app.
Sponsor Hacking with Swift and reach the world's largest Swift community!
Link copied to your pasteboard.