我正在开发一个项目,通过构建一个与 PHP/MySQL api 对话的小型应用程序来学习 obj-c。
每次用户执行某些操作时,都会为此用户设置一个新的身份验证密钥并将其发送到客户端。客户端收到此值并应将其设置为 NSUserDefaults。这是为了不让用户在程序每次启动时都登录;如果该密钥存在,它将尝试使用该密钥进行身份验证,然后自动登录。
有时这有效......我有两个功能,一个用于接收,一个用于设置。它们看起来像这样:
//GET
-(NSString*)GetValue:(NSString *)Name
{
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
NSString *get = [prefs stringForKey:Name];
if(get)
return get;
else
return FALSE;
}
//SET
-(void)SetValue:(NSString*)Name:(NSString*)Value
{
//Add new...
[[NSUserDefaults standardUserDefaults] setObject:Value forKey:Name];
}
Run Code Online (Sandbox Code Playgroud)
这几乎有效。
问题是这样的:
1)未设置auth-key值(在NSUserDefaults中)
2)我尝试登录用户,值设置(如“aaaaaaaaaaaaaaaaa”),一切都很好。我重新启动程序,它获取这个存储的值,尝试登录,从 PHP 返回一个积极的结果以及一个新的密钥,当答案返回时必须设置该密钥......就像这样......
if(NewKey.length > 0)
{
NSLog(@"TRY SET KEY: %@", NewKey);
[self SetValue:@"auth_key":NewKey];
NSLog(@"TRY GET KEY: %@", [self GetValue:@"auth_key"]);
}
Run Code Online (Sandbox Code Playgroud)
3)上面的NSLog显示“TRY SET KEY: bbbbbbbbbbbbbbbb”和“TRY GET KEY: bbbbbbbbbbbbbbbb”。看起来很完美!
4)好吧,我杀掉程序并重试,现在它应该已经存储了“bbb ...”,对吧?错误的!当我现在 NSLogs 这个值时,它仍然是“aaa...”
5)我再次尝试登录,NSLog 说“尝试设置密钥:ccc...”和“尝试获取密钥:ccc...” - 它说这个值被存储。但它不是...
6) 我杀死程序,重新启动并得到“aaa...”。 …
我想知道访问存储在NSUserDefaults. 这是否比访问一次并将其存储在属性中,然后通过从属性获取它而不是再次获取它来在将来使用它要慢得多NSUserDefaults?或者差异非常微不足道?我知道文档状态NSUserDefaults已缓存。
答案可能取决于您计划获取它的频率。假设每分钟需要 20 次。我不会以编程方式更改它,只会获取当前值。
我很好奇,因为总是获取它的好处之一是你可以保证那是当前值。如果您获取一次并存储它,您需要监听更改,NSUserDefaults然后通过获取它来更新存储的值。
So my table view is not loading anything and I think it's because of this warning that I get. It saids the save function is not being used so how can it load something that is not saved. What I am saving is the indexPath and Section of the row that the user selected via a button action in the row.
Warning:
Result of call to 'save(defaults:)' is unused
Code:
func saveSorting(_ dataIdBlock: (Any) -> String) {
guard let items …Run Code Online (Sandbox Code Playgroud) 我是 swift 的新手,并试图找出存储用户默认值的最佳方式。这是我的应用程序的 3 个初始 VC 类,我将数据从登录视图传递到开始您的计划视图,再到用户信息(配置文件视图)——这是我需要为用户存储默认值的地方。我的问题是 - 存储的唯一用户默认值是“姓名”和“月薪”似乎也有效。但是“每日预算默认值”和“每日储蓄默认值”(双打)似乎没有存储并出现在第三个屏幕(用户配置文件)上。我没有得到正确的参考。
第一段代码来自登机视图控制器,我在那里收集他们的信息 - 为了简短起见,我只显示了 calculateData IBAction。截至目前 - 这是我试图获取他们的用户默认值的地方。
信息的第二个 VC是在登机后直接查看的视图,用户可以在其中查看他们的信息 - 一旦他们从这个 VC 开始 - 我创建一个新的用户对象(我应该只创建一个新用户对象的数组并将其存储在 NSUserDefaults 下这里?)
第三个 VC - 这是实际的用户配置文件,我需要在其中显示所有用户默认值。我将把它设置为初始视图控制器并在应用程序委托中设置,如果用户之前已经完成了登录屏幕,则首先加载此页面。
请并感谢您的任何帮助!
import UIKit
class ViewController: UIViewController, UITextFieldDelegate{
@IBAction func calculateDataButtonPressed(_ sender: UIButton) {
customerName = nameTextField.text!
if let payTotal = Double(monthlyAmountTextField.text!){
monthlyEarning = payTotal
}
if let savingsNumber = Double(desiredSavingsTextField.text!){
desiredSavingsAmount = savingsNumber
}
else {
displayLabel.text = "Enter input as so: 1299.39"
}
budgetForEachDay = ((monthlyEarning - …Run Code Online (Sandbox Code Playgroud) 我正在从事一个 iOS 项目,该项目UserDefaults在启用文件保护时面临访问值的问题。Apple 社区中有几篇关于UserDefaults无法访问问题的帖子。一些讨论是,
这对我来说真的很令人沮丧,因为我的应用程序用于检查键FirstTimeAppLaunched的布尔值并基于它db encryption password为我的数据库重新创建的值。由于上述问题,一旦UserDefault无法访问,我的应用程序就会重新创建新密码,并最终丢失用户以前使用不同密码使用的所有数据。
现在我想使用整数状态而不是布尔值,因此我需要使用,
UserDefaults.standard.register(["FirstTimeAppLaunched", 0]);
Run Code Online (Sandbox Code Playgroud)
当应用程序启动时。第一次启动后我将其设置为 1,
UserDefaults.standard.set(1, forKey: "FirstTimeAppLaunched");
Run Code Online (Sandbox Code Playgroud)
在这种情况下我需要确认,
如果UserDefault由于上述问题而无法访问标准,是否可以保证 key 的返回值FirstTimeAppLaunched是NULL我使用方法注册的默认值UserDefaults.standard.register?
我创建了一个简单的应用程序,当你点击一个按钮,它保存第一次点击与1第二个同时1.所以,我试图检查第一次点击是否等于1然后NSLog它没有奏效.
这是我的代码:
-(IBAction)add:(id)sender
{
//Once the user click on the button it adds 1
static int num = 0;
num+=1;
//Save the number for key "saved and the number" ex: if number is 1 so for key is "saved 1"
NSString *dataa = [NSString stringWithFormat:@"%i", num];
NSString *fkey = [NSString stringWithFormat:@"saved %i", num];
NSUserDefaults *def = [NSUserDefaults standardUserDefaults];
[def setObject:dataa forKey:fkey];
[def synchronize];
}
-(IBAction)load:(id)sender
{
//load the data forkey "saved 1" wich will …Run Code Online (Sandbox Code Playgroud) 我有一个按钮,允许用户将帖子标记为收藏.
这是我的代码:
+(NSMutableArray*) getFavoritePostsArray {
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
NSMutableArray *tempArray = [userDefault mutableArrayValueForKey:@"favoritePostArray"];
if ([tempArray count] == 0) {
return [[NSMutableArray alloc] init];
}
else {
return tempArray;
}
}
+(BOOL)addFavoritePost:(CostumSDPost *)post {
NSUserDefaults *userDefault = [NSUserDefaults standardUserDefaults];
NSMutableArray *tempArray = [GlobalFunctionAndVariable getFavoritePostsArray];
NSDictionary *tempPost = @{
@"title" : post.title,
@"ID": post.ID,
@"imageURL": post.imageURl,
@"viewsNumber" : post.viewsNumber,
@"content" : post.content,
@"date": post.date,
@"authorName": post.authorName,
@"categoryList": post.categoryList,
@"commentsArra": post.commentsArray,
@"commentsStatus": post.commentsStatus,
@"commentsNumber":[[NSString alloc] initWithFormat:@"%lu", post.commentsNumber],
};
[tempArray addObject:tempPost];
//[userDefault …Run Code Online (Sandbox Code Playgroud) 我正在尝试检查NSUserDefault中是否存在特定密钥.问题是它不断返回错误.怎么回复lldb错误?
if let data = NSUserDefaults.standardUserDefaults().objectForKey("teams") as? NSData {
}
Run Code Online (Sandbox Code Playgroud) let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH:mm "
let selectedDate = dateFormatter.string(from: sender.date)
UserDefaults.standard.set(selectedDate, forKey: "date")
print(selectedDate)
\\method to reload the selected time inside the viewdidLoad func
let selectedDate = UserDefaults.standard.object(forKey: "date")
example.setDate(selectedDate as! Date ?? Date(), animated: false)
Run Code Online (Sandbox Code Playgroud)
但是当我运行应用程序时,它会返回此错误
无法将类型'__NSCFString'(0x108e8b4f0)的值转换为'NSDate'(0x108e8c0d0).
我转换为HH:mm因为我想只记录这种格式的时间,但我不知道我将如何处理它
我在后台做一些事情.我也尝试将对象写入标准用户默认值.从iOS 9开始,它就崩溃了.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// calling some methods in the background
// also save a value to the user defaults
NSDate *aDate = [NSDate date];
[[NSUserDefaults standardUserDefaults] setObject:aDate forKey:@"date"]; // <-- crash: EXC_BAD_ACCESS
});
Run Code Online (Sandbox Code Playgroud)
我找不到问题.aDate不是零.我也尝试在主线程(来自后台线程)上执行setObject:但结果相同.
崩溃是零星的!我做错了什么?
这是堆栈跟踪:
崩溃:com.apple.root.background-qos EXC_BAD_ACCESS KERN_INVALID_ADDRESS位于0x0000000000000010
线程:崩溃:com.apple.root.background-qos 0 libobjc.A.dylib
0x0000000199b0dbd0 objc_msgSend + 16 1基础
0x0000000185ea1eb4 - [NSObject(NSKeyValueObserverNotification)willChangeValueForKey:] + 324 2 CoreFoundation
0x0000000185090994 _CFPreferencesSetValueWithContainer + 168 3 Foundation 0x0000000185eb9138 - [NSUserDefaults( NSUserDefaults)setObject:forKey:] + 56 4 AIR 0x00000001000f201c - [ServerSyncAgent syncUnsyncedEntities](ServerSyncAgent.m:212)5 libdispatch.dylib
0x000000019a2e97b0 _dispatch_call_block_and_release + 24 6 …
nsuserdefaults ×10
ios ×8
swift ×4
objective-c ×3
cocoa ×1
cocoa-touch ×1
crash ×1
datapicker ×1
ios13 ×1
ios9 ×1
nscoding ×1
warnings ×1