标签: userdefaults

UserDefaults 初始化程序中 suiteName 的真正含义是什么?

我试图掌握某种单元测试,因此我们创建模拟用户默认值。

class MockUserDefaults: UserDefaults {
var gameStyleChanged = 0
override func set(_ value: Int, forKey defaultName: String) {
if defaultName == "something" {
  someStyleChanged += 1
}
}
} 
Run Code Online (Sandbox Code Playgroud)

在 setup() 之后我创建了

mockUserDefaults = MockUserDefaults(suiteName: "testing")! 
Run Code Online (Sandbox Code Playgroud)

所以我很困惑,我无法理解 suiteName 的完整含义,我已阅读官方文档,但还不够清楚,请帮助

nsuserdefaults ios swift userdefaults

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

更新保存的 Codable 结构以添加新属性

我的应用程序使用一个可编码的结构,如下所示:

public struct UserProfile: Codable {

     var name: String = ""
     var completedGame: Bool = false

     var levelScores: [LevelScore] = []
}
Run Code Online (Sandbox Code Playgroud)

AJSONEncoder()已用于将UserProfiles的编码数组保存为用户默认值。

在即将到来的更新中,我想向这个UserProfile结构添加一个新属性。这在某种程度上可能吗?

或者我是否需要创建一个具有相同属性和一个新属性的新 Codable 结构,然后将所有值复制到新结构中,然后开始使用该新结构代替UserProfile之前使用该结构的任何地方?

如果我只是向结构体添加一个新属性,那么我将无法加载之前编码的UserProfiles数组,因为结构体将不再具有匹配的属性。当我使用此代码加载已保存的用户时:

if let savedUsers = UserDefaults.standard.object(forKey: "SavedUsers") as? Data {
       let decoder = JSONDecoder()
       if let loadedUsers = try? decoder.decode([UserProfile].self, from: savedUsers) {
Run Code Online (Sandbox Code Playgroud)

loadedUsers如果在UserProfile编码和保存时具有的属性不包含结构的所有当前属性,则不解码UserProfile

有关更新保存的结构属性的任何建议?或者我必须走很长的路并重新创建,因为我之前没有提前计划要包含此属性?

谢谢你的帮助!

struct properties ios swift userdefaults

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

如何为 UserDefaults 编写单元测试

我有两个函数,其中一个函数基本上检索用户默认值中的字符串,另一个函数将字符串写入用户默认值中。我不明白我应该进行单元测试还是不进行?我对单元测试的概念还很陌生。

我在互联网上搜索测试用户默认值,但最后建议我模拟测试。

我的问题是,如果有办法测试用户默认值,最好的方法是什么?

常量和结构体

let defaults = UserDefaults.standard
let defaultinformation = "ABCDEFG"

struct Keys {
    static let Information = "Information"
}
Run Code Online (Sandbox Code Playgroud)

保存信息的功能

func SetDefaultInformation() {
    defaults.set(defaultinformation, forKey: Keys.Information)

}
Run Code Online (Sandbox Code Playgroud)

检索信息的函数

func checkForInformation() -> String {
    let Information = defaults.value(forKey: Keys.Information) as? String ?? ""
    return Information
}
Run Code Online (Sandbox Code Playgroud)

提前致谢

nsuserdefaults xctest swift userdefaults swift5

6
推荐指数
2
解决办法
5465
查看次数

如何在 Swift 中的 UserDefaults 中保存默认打印机?

这是我的应用程序的工作流程: 用户可以从应用程序的设置页面选择默认打印机,并且每次都会直接使用该默认打印机进行打印,而无需任何打印预览对话框

我们可以使用以下方法选择打印机UIPrinterPickerController

let printerPicker = UIPrinterPickerController(initiallySelectedPrinter: nil)
printerPicker.present(from: CGRect(x: 0, y: 0, width: 600, height: 500), in: self, animated: true) { (printerPicker, userDidSelect, error) in
    if userDidSelect {
        //Here get the selected UIPrinter
        let defaultPrinter = printerPicker.selectedPrinter
    }
}
Run Code Online (Sandbox Code Playgroud)

获取后UIPrinter,我们不能直接将UIPrinter对象保存到UserDefaults,这不是UserDefault支持类型。

是否有任何其他选项可以保存UIPrinter到用户默认值或任何其他方式来保存默认打印机。

printing ios swift swift3 userdefaults

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

仅检索我存储在 UserDefaults 中的键和值

我已经用套件创建了 UserDefaults,

self.moviesWatchedUserDefaults = UserDefaults(suiteName: "com.apple.tv.2020")
Run Code Online (Sandbox Code Playgroud)

并将信息存储在 plist 中,例如

self.moviesWatchedUserDefaults.set(data, forKey: key).
Run Code Online (Sandbox Code Playgroud)

现在,在检索时,我想检索所有键和值。我正在使用的,

var watchedList = self.moviesWatchedUserDefaults?.dictionaryRepresentation()
Run Code Online (Sandbox Code Playgroud)

但返回的列表不仅包含我存储的项目,还包含其他键,如NSLanguagesAppleKeyboardsAppleKeyboardsExpandedCarCapabilities等,

如何检索所有键和值(仅我存储的键和值)?

nsuserdefaults ios swift userdefaults

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

ios 14 小部件:如何在 UserDefaults 更改后重新加载时间线

我有一个 ios 14 小部件,每 5 分钟刷新一次

let timeline = Timeline(entries: entries, policy: .atEnd)
Run Code Online (Sandbox Code Playgroud)

entries取决于我的 MainApp 上的配置。

我用来UserDefaults在 MainApp 和 Widget 之间共享数据。

@AppStorage("FollowingCatalog", store: UserDefaults(suiteName: "group.vn.f19.com"))
var catalogItemsData: Data = Data()
Run Code Online (Sandbox Code Playgroud)

我已成功根据UserDefaults数据镜像小部件内容。但我的问题是我的小部件仅在 .atEnd 策略之后每 5 分钟刷新一次 UI

这会导致糟糕的用户体验

UserDefaults我的配置更改后如何立即刷新小部件内容?

感谢您的支持。

timeline widget reload ios userdefaults

5
推荐指数
2
解决办法
2498
查看次数

当 Userdefaults 中的对象更改时更新 SwiftUI 视图

我正在 XCode 中开发一个应用程序,该应用程序显示从 URL 保存在 JSON 文件中的位置。我已将用户最喜欢的位置保存在 UserDefaults.standard.object(forKey: "heart") 中

SpotDetailView 上的心形按钮可保存该地点,并显示该地点是否为收藏夹。

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] ?? [:]
    
    
    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)

swift userdefaults swiftui

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

如何在UserDefaults中保存元组数组

我在我的一个文件中使用了一个数组元组,并希望开始保存它UserDefaults.以下是我存储当前数据的方式:

typealias savemytuple = (Name: String, NameID: String, BookID: String, Picture: NSData)
var savefun = [savemytuple]()
Run Code Online (Sandbox Code Playgroud)

我已经研究过,发现我可能需要对以下内容进行一些保存:

NSKeyedArchiver.archivedDataWithRootObject
Run Code Online (Sandbox Code Playgroud)

这用于检索:

NSKeyedUnarchiver.unarchiveObjectWithData
Run Code Online (Sandbox Code Playgroud)

不确定这种方式是否有效,因为我的元组有多种数据类型.有关如何做到这一点的任何想法?

ios swift userdefaults

4
推荐指数
2
解决办法
1472
查看次数

对 Swift [UI] 中的 UserDefaults 感到疯狂

开始使用 Swift 和 SwiftUI,我发现从 UIKit 迁移的过程非常困难。目前被 UserDefaults 跺脚,即使在尝试理解我在网上找到的许多教程之后也是如此。

请告诉我我在这里做错了什么:非常简单的代码:

  1. 将布尔值注册到 UserDefault,
  2. 在文本中显示该布尔值!

没有比这更简单的了。但我无法让它工作,因为对 UserDefaults 的调用会抛出此错误消息:

实例方法“appendInterpolation”要求“Bool”符合“_FormatSpecifiable”

我的“应用程序”是默认的单视图应用程序,有以下 2 处更改:

1- 在 AppDelegate 中,我注册了我的 bool :

func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
    // Override point for customization after application launch.

    UserDefaults.standard.register(defaults: [
    "MyBool 1": true
    ])


    return true
}
Run Code Online (Sandbox Code Playgroud)

2- 在 ContentView 中,我尝试显示它(在 struct ContentView: View 中):

let defaults = UserDefaults.standard

var body: some View {
    Text("The BOOL 1 value is : Bool 1 = \(defaults.bool(forKey: …
Run Code Online (Sandbox Code Playgroud)

swift userdefaults swiftui

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

用于单元测试的 UserDefaults 实例?

我有一堂课我想测试。它在其逻辑中使用 UserDefaults。我知道我必须注入一个测试替身来测试它,但我想不费太多力气就可以完成它。

如果可以制作一个仅在单元测试期间有效的临时 UserDefaults 实例,那将是最好的。或者我最终必须编写一个用于模拟的包装器?

unit-testing nsuserdefaults swift userdefaults

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