标签: appstorage

如何在 SwiftUI 中使用 @AppStorage 存储 EnumType

我想将地图状态存储在UserDefaults. 是否可以做这样的事情:

@AppStorage("myMapType") var mapType: MKMapType = .standard
Run Code Online (Sandbox Code Playgroud)

或者我必须访问 rawValue 吗MKMapType?我怎么能这样做呢?

swiftui appstorage

12
推荐指数
2
解决办法
3467
查看次数

@AppStorage可以在SwiftUI中的Environment中使用吗?

@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)

environment swift swiftui appstorage

8
推荐指数
1
解决办法
2437
查看次数

使用 AppStorage 在 SwiftUI 中持久存储字符串数组

我正在尝试使用 AppStorage 属性包装器在用户默认值中存储字符串数组,如下所示:

@AppStorage("History") var history: [String] = ["End of history"]
Run Code Online (Sandbox Code Playgroud)

但是我得到了错误No exact matches in call to initializer

如果我没记错的话,这是 AppStorage 的限制吗?因为 UserDefaults 可以存储数组?我可以使用什么解决方法?

arrays swift userdefaults swiftui appstorage

8
推荐指数
0
解决办法
2017
查看次数

如何将变量存储为 @AppStorage 变量的键

所以我想在我的应用程序中切换到@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 做到这一点?

swift swiftui appstorage

5
推荐指数
1
解决办法
1574
查看次数

如何在带有@Published的模型中使用@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)

iphone in-app-purchase swift swiftui appstorage

5
推荐指数
1
解决办法
2700
查看次数

@App存储和MKCooperativeRegion函数

是否可以在 @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)

mkcoordinateregion swiftui appstorage

5
推荐指数
1
解决办法
209
查看次数

SwiftUI - AppStorage 不适用于 GeometryReader

这是一个简单的例子。您可以创建新的 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)

ios swift swiftui geometryreader appstorage

5
推荐指数
1
解决办法
449
查看次数

在 AppStorage 中设置自定义 Struct 值时应用程序崩溃

我有一个想要存储在的自定义结构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)

ios swift swiftui appstorage

4
推荐指数
1
解决办法
334
查看次数

将 @AppStoarge 与自定义对象数组一起使用不会保留数据

我对 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)

class swift swiftui appstorage

3
推荐指数
1
解决办法
3119
查看次数

如何将 @AppStorage 用于字符串字典 [String: String]

嘿,在我的应用程序中,我试图存储用户是否希望某个位置成为其最喜欢的位置。为了在此 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)

xcode swift swiftui appstorage

2
推荐指数
1
解决办法
2548
查看次数

SwiftUI @AppStorage 并不总是持久的价值

我正在@AppStorageString财产一起使用。更改属性值时,视图会自动更新以反映预期的更改。然而,大多数时候它并没有持续存在UserDefaults。我觉得自己错过了一些东西,这让我感觉很愚蠢。还有其他人看到这个吗?

脚步:

  • 启动应用程序
  • 改变值
  • 杀死并重新启动应用程序
  • 将值更改为其他值
  • 杀死并重新启动应用程序

环境:

  • Xcode 13.4 (13F17a)
  • iOS 15.5 - iPhone 13 Pro 模拟器

非常简单的例子:

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)

示例 gif

resolver ios swiftui appstorage

1
推荐指数
1
解决办法
1670
查看次数