如果我设置了一个NSUserDefault对象并尝试在同步之前访问它,我是否可以访问刚刚添加的对象?
我已经尝试编写代码来测试它,但我不确定在没有我知道的情况下同步是否正在发生.
有没有办法将这段代码重新创建到 Objective c 中?我刚刚开始,我需要一些帮助。
String name = #;// Will often vary.
SharedPreferences userData = this.getSharedPreferences(name + "userdata", MODE_PRIVATE);
Editor edit = userData.edit();
edit.clear();
edit.putFloat("rating", Rating.getRating());
edit.putString("good", txtGood.getText().toString().trim());
edit.putString("improve", txtImprove.getText().toString().trim());
edit.commit();
Log.d(TAG, "Saving Data");
Run Code Online (Sandbox Code Playgroud)
这段代码的优点是每次调用该方法时都会创建一个新的 SharedPreference。根据我使用 NSUserDefaults 的经验,它只能生成一批数据。
我在尝试比较我的得分和高分时遇到一些问题,看看哪一个更大然后保存.我认为问题在于比较和保存高分和得分.非常感谢帮助!
//Comparison between score and highscore
if score > highscore {
let defaults: NSUserDefaults = NSUserDefaults.standardUserDefaults()
highscore = defaults.valueForKey("highscore")?.integerValue ?? 0
defaults.setInteger(score, forKey: "highscore")
defaults.synchronize()
highscoreString = String(highscore)
highscoreLabel.text = highscoreString }
Run Code Online (Sandbox Code Playgroud)
全页代码 - https://github.com/SRL311/Highscore/blob/master/Highscore (对不起那里令人困惑的大写字母和小写字母)
我正在尝试保存从 Parse.com 检索的图像,如下所示:
let userImageFile = object["Image"] as PFFile
userImageFile.getDataInBackgroundWithBlock {
(imageData: NSData!, error: NSError!) -> Void in
if error == nil {
image = UIImage(data:imageData)
let imageToSave:NSData = UIImagePNGRepresentation(image)
self.saveImage(intRandomNumb, retImage: imageToSave)
}
}
Run Code Online (Sandbox Code Playgroud)
saveImage 函数如下所示:
func saveImage(imagepath:Int, retImage:NSData){
println("image is being saved")
let defaults = NSUserDefaults.standardUserDefaults()
let imagePathName = "\(imagepath)"
defaults.setObject(retImage, forKey: imagePathName)
}
Run Code Online (Sandbox Code Playgroud)
后来,我试图像这样显示这个图像:
var point = gestureRecognizer.locationInView(self.tv)
if let indexPath = self.tv.indexPathForRowAtPoint(point)
{
let data = mainList[indexPath.row] as SecondModel
let fileRef = data.fileReference
let intFileRef = …Run Code Online (Sandbox Code Playgroud) 我想要做的是将我的初始用户默认值存储在 plist 中,然后在应用程序第一次加载时将它们读入 NSUserDefaults。
到目前为止,我找到了几篇对我有帮助的帖子,但是我似乎无法找到有关为什么我在展开时发现 nil 的答案。显然我错过了一些东西,所以我的问题是:
如何将 plist 正确注册到 NSUserDefaults?
我用我的默认设置创建了一个 plist。我想从 plist 中读取并将它们注册到 NSUserDefaults 中。
设置.plist

视图控制器.swift
class ViewController: UIViewController {
let userDefaults = NSUserDefaults.standardUserDefaults()
override func viewDidLoad() {
super.viewDidLoad()
let prefs = NSBundle.mainBundle().pathForResource("Settings", ofType: "plist")
let dict = NSDictionary(contentsOfFile: prefs!)
if let dictionary = dict {
println("Contents of file unwrapped: \(dictionary)") // <---------
let defaults : NSDictionary! = dictionary.valueForKey("Root") as? NSDictionary
println("defaults: \(defaults)") // <---------
userDefaults.registerDefaults(defaults as! [NSObject : AnyObject])
userDefaults.synchronize()
}
if let unwrapDict …Run Code Online (Sandbox Code Playgroud) 我需要存储一个可以包含nil作为值的字典
例
var someOptionalVar: String? = nil
var dict: [String: AnyObject?] = [
"someOptionalVar": self.someOptionalVar
]
defaults.setObject(dict, forKey: self.nsUserDefaultsKey)
Run Code Online (Sandbox Code Playgroud)
但它给了我这个错误
无法将'[String:AnyObject?]'类型的值转换为预期的参数类型'AnyObject?'
我知道我可以保留nil变量然后当我从NSUserDefaults解析字典时,我会将变量(对应于缺少的属性)设置为nil,但这不是我想要做的.
那么如何在NSUserDefaults中存储nil值?
我有一个登录视图控制器,用户可以在其中输入他们的首选项,例如他是否要激活某些UI功能.
我将这些存储为getter和setter直接访问的变量UserDefaults,以下是其中一个示例:
class Preferences {
static var likesSpaghetti : Bool {
set (likesSpaghetti) {
UserDefaults.standard.set(likesSpaghetti, forKey: "likesSpaghetti")
}
get {
return UserDefaults.standard.bool(forKey: "likesSpaghetti")
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此,每当我想要设置其中任何一个时,我只需编写如下内容:
Preferences.likesSpaghetti = false
现在,我的问题是:每次用户轻拂开/关开关时我都可以设置这些变量,还是应该将首选项保持为局部变量,然后才设置:
Preferences.likesSpaghetti = spaghettiSwitch.isOn
当用户离开时loginViewController?每次访问都是UserDefault即时快速的吗?或是它是否滞后,应该仁慈地使用?
关闭这个问题后编辑:所以我学会了不要过早地优化,并且它可能在几十个元素的范围内.所以我应该没事.每次用户修改任何内容时我都会更新,以便我的代码更容易阅读和维护.
感谢大家!
是否仍然可以在 iOS 和 tvOS 之间共享 UserDefaults?
在我的 Xcode 项目中,我用于UserDefaults在 iOS 目标和 tvOS 目标之间共享数据。UserDefaults当我尝试从我的 tvOS 应用程序取回数据时,我总是收到来自我的 nil 值。
这些是我共享数据所采取的步骤:
1:为两个目标添加应用程序组。两个目标使用相同的应用程序组 ID: group.nl.mycompany.myappname。
我使用 .nl 域,但这应该没问题,因为这也适用于我的其他项目。
2:确认两个目标具有相同的部署目标。我尝试使用 10.0 和 11.0。
3:验证 myproject.entitlements 是否一切正常。
4:验证在 developer.apple.com 上为我的包标识符启用了应用程序组。
5:两个目标具有相同的包 ID。我还尝试使用 2 个不同的包标识符。
6:我UserDefaults从我的 iOS 应用程序写入的方式:
guard let defaults = UserDefaults(suiteName: "group.nl.mycompany.myappname") else { return }
defaults.set("Apple", forKey: "username")
defaults.synchronize()
Run Code Online (Sandbox Code Playgroud)
我通过获取如下值来确认这在我的 iOS 应用程序中有效:
guard let defaults = UserDefaults(suiteName: "group.nl.mycompany.myappname") else { return nil }
defaults.synchronize()
let name …Run Code Online (Sandbox Code Playgroud) 做了一个简单的增量游戏。我希望这样即使我转到不同的VC然后返回游戏或重新打开游戏,它也会显示当前分数。我的问题是,如果我离开游戏,那么分数将归零。我不希望这种情况发生。分数不应该被重置。我听说我可以使用 UserDefaults,但我根本不熟悉它。如果您可以使用代码进行解释,那将是最好的。谢谢。
import UIKit
class CookieClickerVC: UIViewController {
@IBOutlet weak var goldLabel: UILabel!
@IBOutlet weak var numberOfGold: UILabel!
@IBOutlet weak var getGoldButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
formatItems()
let defaults = UserDefaults.standard
defaults.set(0, forKey: "goldCount")
}
@IBAction func getGoldClicked(_ sender: Any) {
goldCount += 1
numberOfGold.text = ("\(goldCount)")
}`
Run Code Online (Sandbox Code Playgroud)
此外,您可能已经想通了,但是 goldCount 是一个未解析的标识符。单击按钮后我应该如何更改代码?
如何@AppStorage在 SwiftUI 应用程序中使用字符串映射?
这就是我想要做的:
@AppStorage("ratings") var ratings: [String: Double] = []
Run Code Online (Sandbox Code Playgroud)
但这给了我错误消息“调用初始化程序时没有完全匹配”。查看文档时,似乎只支持几种数据类型。可以将其编码为Data?
nsuserdefaults ×10
swift ×7
ios ×6
objective-c ×2
xcode ×2
android ×1
arrays ×1
ios14 ×1
nsdata ×1
plist ×1
swiftui ×1
synchronize ×1
tvos ×1
uiimageview ×1
uikit ×1