My Object符合新的Swift 4 Codeable协议.如何保存这些对象的数组UserDefaults?
struct MyObject: Codeable {
var name: String
var something: [String]
}
myObjectsArray = [MyObject]() // filled with objects
UserDefaults.standard.set(myObjectsArray, forKey: "user_filters")
Run Code Online (Sandbox Code Playgroud)
错误
由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'尝试插入非属性列表对象
Swift 3.0 UserDefaults()和之间是否存在差异UserDefaults.standard?
只是想在这里格外小心......
如果我有一个应用程序在 UserDefaults 中保存了一个值,就像 Objective-C 中的这样:
NSString *newString = textField.text;
[[NSUserDefaults standardUserDefaults] setObject: newString forKey:@"textKey"];
Run Code Online (Sandbox Code Playgroud)
当我发布对现在用 Swift 编码的应用程序的更新时,这是否是检查该值是否存在的正确方法:
if (UserDefaults.standard.object(forKey: "textKey") as? String) != nil {
print("There is a string")
} else {
print("No string exists")
}
Run Code Online (Sandbox Code Playgroud)
我尝试使用 .string(forKey:) 和 .bool(forKey:) ,因为它们已经被引入了,但是它是最安全的,因为它被保存为一个对象,将其作为一个对象拉出来,然后用“as?细绳”?
同一问题的棘手版本:
NSDictionary 对象的 NSMutableArray 被保存为 UserDefaults 中的对象
if let oldData = UserDefaults.standard.object(forKey: "theData") as? [NSMutableDictionary] {
}
Run Code Online (Sandbox Code Playgroud)
NSDictionary 和 NSMutableDictionary 在这里可以互换吗?
谢谢!
如果userDefault为空,我试图拒绝访问某个视图控制器,但是代码似乎无法正常工作。为了更清楚一点,我将收藏夹列表保存到userDefault中。这是我的代码:
if UserDefaults.standard.array(forKey: "favorites") == nil {
navigationController?.popToRootViewController(animated: true)
return
}
Run Code Online (Sandbox Code Playgroud)
错误是索引超出范围,这意味着整个块都将被忽略(此块运行后的代码,并且由于用户默认值为空,因此在尝试检索不存在的信息时会崩溃)。
有趣的是,代码在我第一次尝试进入viewController时起作用(它拒绝我访问)。但是,如果我最喜欢标记一个对象(保存到userDefault),然后取消收藏同一对象(userDefault变为空),然后输入viewController,程序将崩溃。
我试过了:
if let favExist = UserDefaults.standard.array(forKey: "favorites") {
print("")
print("FAV EXISTS")
print("")
}else {
print("")
print("NOPE")
print("")
navigationController?.popToRootViewController(animated: true)
return
}
Run Code Online (Sandbox Code Playgroud)
...同样的问题仍然存在。在print()中,日志告诉我“我喜欢的标记”,“然后不喜欢的标记”之后“收藏夹存在”,然后尝试访问页面(即使userDefault现在应该为空)。
我也尝试过其他线程的代码。从另一个线程解决我的问题的建议代码是:
let defaults = UserDefaults.standard
if (!defaults.bool(forKey: "favorites")) {
defaults.set(true, forKey: "favorites")
}
Run Code Online (Sandbox Code Playgroud)
我不太确定如何实现它?我在哪里使用?它是做什么的?
知道有什么问题吗?
我正在尝试对结构进行编码
struct Configuration : Encodable, Decodable {
private enum CodingKeys : String, CodingKey {
case title = "title"
case contents = "contents"
}
var title : String?
var contents: [[Int]]?
}
Run Code Online (Sandbox Code Playgroud)
转换成 JSON 以存储在 UserDefaults.standard 的本地键中。我有以下代码:
let jsonString = Configuration(title: nameField.text, contents: newContents)
let info = ["row" as String: jsonString as Configuration]
print("jsonString = \(jsonString)")
//trying to save object
let defaults = UserDefaults.standard
let recode = try! JSONEncoder().encode(jsonString)
defaults.set(recode, forKey: "simulationConfiguration")
//end of saving local
Run Code Online (Sandbox Code Playgroud)
打印返回:
jsonString = Configuration(title: Optional("config"), …Run Code Online (Sandbox Code Playgroud) 我试图让用户选择保存他们的当前位置。我使用默认值来保存它,我发现了如何获取用户位置。但我不确定如何将这两项任务结合起来。所以这是我的问题:
如何让我的函数调用用户位置,以便保存?
@IBAction func addLocation(_ sender: Any) {
// CALL LOCATION MANAGER TO GET LOCATION IN LAT AND LONG
self.saveDefaults()
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
guard let locValue: CLLocationCoordinate2D = manager.location?.coordinate else { return }
print("locations = \(locValue.latitude) \(locValue.longitude)")
}
func saveDefaults()
{
UserDefaults.standard.set(self.pickers, forKey: "pickers")
print("SAVED PICKERS: \(pickers)")
}
Run Code Online (Sandbox Code Playgroud)
这是我最近的尝试,但我不知道为什么我的 struct (lat: ,long:) 没有接受输入
@IBAction func addLocation(_ sender: Any) {
var locations: [CLLocation]
let manager: CLLocationManager
let userLocation:CLLocation = locations[0] as CLLocation
// Call stopUpdatingLocation() …Run Code Online (Sandbox Code Playgroud) 是否可以访问SharedPreferences从插件的 Swift 代码中访问的 Flutter 保存的内容?在Android中,我们必须FILE为模式SharedPreferences。Swift 4 中的任何类似功能?
我正在尝试将用户图像保存到 userDefaults,但我总是收到错误“线程 1:“尝试插入关键已保存图像的非属性列表对象(函数)”这是我的代码
import UIKit
class productSelectionPage: UIViewController {
@IBOutlet weak var productImageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// Save image
let image = UIImage(named: "user")
let imageData = UIImage.jpegData(image)
UserDefaults.standard.setValue(imageData, forKey: "savedImage")
}
@IBAction func offerButtonTapped(_ sender: UIButton) {
// present image
let imageData = UserDefaults.standard.object(forKey: "savedImage")
let image = UIImage(data: (imageData as! NSData) as Data)
productImageView.image = image
// crash
}
}
Run Code Online (Sandbox Code Playgroud) 我有一个arraywith 类型[NotificationTriggers],我想存储在userdefaults. 为此,数据需要是encoded和decoded。我在这里遵循了教程:
https://cocoacasts.com/ud-5-how-to-store-a-custom-object-in-user-defaults-in-swift
和这里:
但我仍然收到一个我似乎无法解决的错误。
我有一个我在变量的 get 和 set 中施展魔法extension的userDefaults地方。NotificationTriggers Struct看起来像这样:
struct NotificationTriggers: Equatable, Codable {
var doorName: String
var notificationTrigger: String
}
Run Code Online (Sandbox Code Playgroud)
Encoding似乎工作,但在decoding我得到一个error说法
无法将“[Any]”类型的值转换为预期的参数类型“Data”
这是代码:
extension UserDefaults {
var notificationTrigger: [NotificationTriggers] {
get {
if let data = self.array(forKey: UserDefaultsKey.notificationTrigger.rawValue) {
do {
let decoder = JSONDecoder()
//CODE BELOW PRODUCE ERROR
if let decodedData = try …Run Code Online (Sandbox Code Playgroud) 当用户更改小部件的配置时,我想读取 UserDefaults,因此我创建了一个应用程序组并将功能添加到我的主应用程序、小部件扩展和 Intent 扩展中。
\n我可以在我的应用程序和小部件扩展之间很好地读写,但是 UserDefaults 总是nil在 IntentHandler.swift 中返回,这可能是什么原因导致的?
// called from TimelineProvider\nfunc example() -> String {\n\nlet sharedDefaults = UserDefaults.init(suiteName: "group.myname")\n let value = sharedDefaults!.value(forKey: "myKey") as! String\n// value == \xe2\x80\x9cHi this works!\xe2\x80\x9d\n}\nRun Code Online (Sandbox Code Playgroud)\n但是当我example()从 IntentHandler 调用时,值是nil. (它崩溃了)