我想将地图状态存储在UserDefaults. 是否可以做这样的事情:
@AppStorage("myMapType") var mapType: MKMapType = .standard
Run Code Online (Sandbox Code Playgroud)
或者我必须访问 rawValue 吗MKMapType?我怎么能这样做呢?
@AppStorage可以在SwiftUI的Environment中使用吗?如果可以,你会怎么做?
我知道您可以使用 @Bindings 将 @AppStorage 的值从一个视图发送到另一个视图,我想知道是否可以将其放入环境中。我没有关于何时适用的实际示例,但我想知道这是否可能。
这足够疯狂吗?我认为您只会存储该值,而不会存储在 UserDefault 中。
struct RootView: View {
@AppStorage("userPreferredDisplayMode") private var userPreferredDisplayMode: String = "automatic"
@Environment(\.userPreferredDisplayMode) private var envUserPreferredDisplayMode: String
var body: some View {
Text(title)
.environment(\.userPreferredDisplayMode, envUserPreferredDisplayMode)
}
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 AppStorage 属性包装器在用户默认值中存储字符串数组,如下所示:
@AppStorage("History") var history: [String] = ["End of history"]
Run Code Online (Sandbox Code Playgroud)
但是我得到了错误No exact matches in call to initializer
如果我没记错的话,这是 AppStorage 的限制吗?因为 UserDefaults 可以存储数组?我可以使用什么解决方法?
所以我想在我的应用程序中切换到@AppStorage,但我遇到了一个特定问题。
对于 @AppStorage 的键,我想使用一个我已经拥有的变量,但我不能这样做,但我曾经找到一种使用用户默认值来做到这一点的方法,如下所示。
@State var isSignedUp = false
Run Code Online (Sandbox Code Playgroud)
因此,我首先将用户默认值初始化为 @State var,然后在 .onAppear 中,我将使用该密钥作为我的 id 变量:
isSignedUp = UserDefaults.standard.bool(forKey: id)
Run Code Online (Sandbox Code Playgroud)
我要问的是如何使用@AppStorage 做到这一点?
我知道@AppStorage只能在视图内使用,但我更喜欢管理模型并利用@AppStorage.
例如,如果我想将购买的产品存储在 中In App Purchasing,我可以使用此解决方法还是最好避免这种情况?
typealias PurchasedProductIdentifiers = Set<String>
extension PurchasedProductIdentifiers: RawRepresentable {
public init?(rawValue: String) {
guard let data = rawValue.data(using: .utf8),
let result = try? JSONDecoder().decode(PurchasedProductIdentifiers.self, from: data)
else {
return nil
}
self = result
}
public var rawValue: String {
guard let data = try? JSONEncoder().encode(self),
let result = String(data: data, encoding: .utf8)
else {
return "[]"
}
return result
}
}
class MyModel: NSObject, ObservableObject {
@Published var purchasedPub: …Run Code Online (Sandbox Code Playgroud) 是否可以在 @App Storage 中保存 MKCooperativeRegion 值?我试过这个。但这不起作用。我收到错误“调用初始化程序时没有完全匹配”。
@AppStorage("region_key") var region = MKCoordinateRegion(
center: CLLocationCoordinate2D(latitude: 34.011_286, longitude: -116.166_868),
span: MKCoordinateSpan(latitudeDelta: 100, longitudeDelta: 100)
)
Run Code Online (Sandbox Code Playgroud) 这是一个简单的例子。您可以创建新的 SwiftUI iOS 项目并将其复制到 ContentView 文件。
import SwiftUI
struct Settings {
static let onOff = "onOff"
}
struct ContentView: View {
@AppStorage(wrappedValue: false, Settings.onOff) var onOff
var body: some View {
NavigationView {
GeometryReader { reader in // < Comment out this line
List {
Section (header:
VStack {
HStack {
Spacer()
VStack {
Text("THIS SHOULD BE FULL-WIDTH")
Text("It is thanks to GeometryReader")
}
Spacer()
}
.padding()
.background(Color.yellow)
HStack {
Text("This should update from AppStorage: ")
Spacer()
Text(onOff == true …Run Code Online (Sandbox Code Playgroud) 我有一个想要存储在的自定义结构AppStorage:
struct Budget: Codable, RawRepresentable {
enum CodingKeys: String, CodingKey {
case total, spent
}
var total: Double
var spent: Double
init(total: Double = 5000.0, spent: Double = 3000.0) {
self.total = total
self.spent = spent
}
init?(rawValue: String) {
guard let data = rawValue.data(using: .utf8),
let result = try? JSONDecoder().decode(Budget.self, from: data)
else { return nil }
self = result
}
var rawValue: String {
guard let data = try? JSONEncoder().encode(self),
let result = String(data: data, encoding: …Run Code Online (Sandbox Code Playgroud) 我对 SwiftUI 相当陌生,想要使用 @AppStorage 属性包装器以数组的形式保存自定义类对象的列表。我在这里找到了几篇文章,帮助我创建了以下通用扩展,我已将其添加到我的 AppDelegate 中:
extension Published where Value: Codable {
init(wrappedValue defaultValue: Value, _ key: String, store: UserDefaults? = nil) {
let _store: UserDefaults = store ?? .standard
if
let data = _store.data(forKey: key),
let value = try? JSONDecoder().decode(Value.self, from: data) {
self.init(initialValue: value)
} else {
self.init(initialValue: defaultValue)
}
projectedValue
.sink { newValue in
let data = try? JSONEncoder().encode(newValue)
_store.set(data, forKey: key)
}
.store(in: &cancellableSet)
}
}
Run Code Online (Sandbox Code Playgroud)
这是我代表该对象的类:
class Card: ObservableObject, Identifiable, Codable{
let id : …Run Code Online (Sandbox Code Playgroud) 嘿,在我的应用程序中,我试图存储用户是否希望某个位置成为其最喜欢的位置。为了在此 UserDefaults 中进行更改更新视图,我需要使用 @AppStorage。但是,目前我只收到错误“调用初始化程序时没有完全匹配”我是否需要使用数据而不是 [String: String],如果是的话如何?有谁知道如何解决这一问题?提前致谢
import SwiftUI
struct SpotDetailView: View {
@State var spot: WindApp //knows which spot it's at
var spotname:String
//@State var favourites: [String:String] = UserDefaults.standard.object(forKey: "heart") as? [String:String] ?? [:]
@AppStorage("heart") var favourites: [String: String] = [:]
var body: some View {
ZStack {
List {
SpotMapView(coordinate: spot.locationCoordinate)
.cornerRadius(8)
ForEach(0..<9) { i in
SingleDayView(spot: spot, counter: (i * 8))
}
}
.navigationTitle("\(spot.spot)")
VStack {
Spacer()
HStack {
Spacer()
Button(action: {
if favourites[spot.spot] == "heart" {
favourites[spot.spot] …Run Code Online (Sandbox Code Playgroud) 我正在@AppStorage与String财产一起使用。更改属性值时,视图会自动更新以反映预期的更改。然而,大多数时候它并没有持续存在UserDefaults。我觉得自己错过了一些东西,这让我感觉很愚蠢。还有其他人看到这个吗?
脚步:
环境:
非常简单的例子:
struct ContentView: View {
@AppStorage("token") var token: String = ""
var body: some View {
Form {
Section("Token") {
Text(token)
}
Section("Debug") {
Button("Update 01") {
token = "token-01"
}
Button("Update 02") {
token = "token-02"
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
appstorage ×11
swiftui ×11
swift ×8
ios ×3
arrays ×1
class ×1
environment ×1
iphone ×1
resolver ×1
userdefaults ×1
xcode ×1