如果在那里保存NSUserDefault对象,我将如何检查"if"语句?我真的不确定怎么称呼它.所以这是一个很短的问题..
谢谢
我花了好几个小时试图让我的项目工作,但我无法让它工作.
基本上,我正在尝试使用NSUserDefaults来保存自定义对象,当用户点击保存按钮并在应用加载时加载所有数据.如果没有保存以前的NSUserDefault,我想设置一些默认值.最后,我在尝试加载以前保存的NSUserDefault时收到EXC_BAD_ACCESS.设置起始数据时,它在第一次加载时工作正常.问题是,当我尝试为它启用NSZombieEnabled和其他env变量时,它会在没有EXC_BAD_ACCESS的情况下以某种方式加载.所以这就是我正在使用的:
[App Delegate.h]
#import <UIKit/UIKit.h>
#import "Note.h"
@interface ToDoWallAppDelegate : NSObject <UIApplicationDelegate> {
...
Note *note;
}
...
@property (retain) Note *note;
@end
Run Code Online (Sandbox Code Playgroud)
[App Delegate.m]
- (void)applicationDidFinishLaunching:(UIApplication *)application {
...
note = [[Note alloc] init];
NSUserDefaults *stdDefaults = [NSUserDefaults standardUserDefaults];
NSData *noteData = [stdDefaults objectForKey:@"Note"];
if (noteData) {
self.note = (Note *)[NSKeyedUnarchiver unarchiveObjectWithData:noteData];
} else {
note.background = [UIImage imageNamed:@"Cork.jpg"];
note.picture = [UIImage imageNamed:@"Cork.jpg"];
note.font = [UIFont fontWithName:@"Helvetica" size:18.0f];
note.fontColor = [UIColor blackColor];
note.fontNameIndex = 9;
note.fontSizeIndex = 6; …Run Code Online (Sandbox Code Playgroud) 在我过去的项目中,我总是创建一个NSObject-HelperClass,它与selfmade-Plist交互.现在我听说我可以使用[NSUserDefaults standardUserDefaults]并且还有我的字典.
那么我为什么要使用UserDefaults而不是我自己的按摩plist的NSObject呢?
欢呼声
我试图存储Double值NSUserDefault但是虽然我能够存储它(因为我的NSLog值显示真值),当我尝试重新加载UITableView时,其Cell值不会更新userdefault中的当前值.
这种奇怪的行为只有在我setUserDefaults从委托方法调用我的方法时才会发生UIAlertView
为什么会出现这种奇怪的行为?
这是我的代码:
- (void)setUserDefaults
{
NSLog(@"setUserDefault : empArray: %d, empCount: %d",empArray.count, empCount);
NSMutableDictionary *empData = [[NSMutableDictionary alloc] init];
if (empArray.count>1)
empData = [empArray objectAtIndex:(empCount-1)]; // because empCount starts from 1. and empArray[0] = empCount 1
else
empData = [empArray objectAtIndex:0];
[userDefault setObject:[NSString stringWithFormat:@"%.2f",[empData objectForKey:@"salary"]] forKey:@"salary"];
NSLog(@"setUserDefaults: salary=%.2f",[[empData objectForKey:@"salary"] doubleValue]);
[empData release];
[self.tblView reloadData];
}
Run Code Online (Sandbox Code Playgroud)
UIAlertView的委托方法如下:
-(void) alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger) buttonIndex
{
if (alertView.tag == 1) // btnRemoveEmpPressed.
{
if(buttonIndex==0)
{
NSLog(@"buttonIndex …Run Code Online (Sandbox Code Playgroud) 我尝试使用-resetStandardUserDefaults,我尝试删除plist文件,没有一个真正做我需要的.我想完全重置我的首选项,就好像重新安装了应用程序一样.有一个很好的解决方案吗?
我试过了 :
NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
[[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
Run Code Online (Sandbox Code Playgroud)
但Xcode抱怨道.显然,它不喜欢plist文件已经消失.这是Xcode的错误:

我有一个NSMutableArray内部AppDelegate,我正试图将它保存到NSUserDefaults.该NSMutableArray(strainsfinal)包含收藏项目列表.我希望此列表保存,即使应用程序关闭也会出现,然后重新启动.有谁知道为什么我的代码不工作(不保存我的数据)?见下文:
AppDelegate.m
-(void)updateStrains:(NSDictionary *)item
{
NSUserDefaults *currentDefaults = [NSUserDefaults standardUserDefaults];
NSData *dataSave = [currentDefaults objectForKey:@"strains"];
if (strainsfinal != nil)
{
NSArray *oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataSave];
if (oldSavedArray != nil)
strainsfinal = [[NSMutableArray alloc] initWithArray:oldSavedArray];
else
strainsfinal = [[NSMutableArray alloc] init];
}
}
Run Code Online (Sandbox Code Playgroud)
编辑:Appdelegate.m所以我已经将上面的方法更改为下面的方法(我认为它应该工作),但应用程序崩溃,说:"由于未捕获的异常'NSInvalidArguementException'终止应用程序,原因:'NSConcreteAttributedString initwithString:零'价值'.
我错过了什么?!
-(void)updateStrains:(NSDictionary *)item {
NSData *dataSave = [NSKeyedArchiver archivedDataWithRootObject:strainsfinal];
[[NSUserDefaults standardUserDefaults] setObject:dataSave forKey:@"strains"];
NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
[nc postNotificationName:@"arrayupdated" object:self userInfo:nil];
NSLog(@"updated strains %@",strainsfinal);
}
Run Code Online (Sandbox Code Playgroud) 我遇到了一个奇怪的错误,想检查我是否正在使用我的Key值正确观察NSUserDefaults的变化.
我在我的应用程序的两个地方使用了这个代码没有问题,然后我添加了第三个控制器,它观察"goldCount"和"energyCount"的值.现在,当我设置初始值时,应用程序崩溃与exc_bad_access.我在使用父视图后2秒将该控制器添加到视图中performSelectorAfterDelay.
在显示游戏屏幕之前,我设置了以下属性:
//crash on this line
[[NSUserDefaults standardUserDefaults] setInteger:200 forKey: goldCount];
[[NSUserDefaults standardUserDefaults] setInteger:150 forKey: energyCount];
Run Code Online (Sandbox Code Playgroud)
在3个不同的视图控制器中,我在viewDidLoad中有这个代码:
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
[defaults addObserver:self
forKeyPath:@"goldCount"
options:NSKeyValueObservingOptionNew
context:NULL];
[defaults addObserver:self
forKeyPath:@"energyCount"
options:NSKeyValueObservingOptionNew
context:NULL];
self.goldLabel.text = [NSString stringWithFormat:@"%i",[[GameDataManager sharedInstance] currentGoldCount]];
self.energyLabel.text = [NSString stringWithFormat:@"%i",[[GameDataManager sharedInstance] currentEnergyCount]];
Run Code Online (Sandbox Code Playgroud)
以下是该类更新其标签的方式:
// KVO handler
-(void)observeValueForKeyPath:(NSString *)aKeyPath ofObject:(id)anObject
change:(NSDictionary *)aChange context:(void *)aContext
{
//aKeyPath gives us the name of a user default that has changed
if([aKeyPath isEqualToString:@"goldCount"])
{
//we are interested in the new …Run Code Online (Sandbox Code Playgroud) exc-bad-access objective-c key-value-observing nsuserdefaults ios
我目前正在为watchOS 2更新我的应用程序,并且在设备之间的通信方面遇到了一些麻烦:之前我一直在使用共享的NSUserDefaults来启用Watch和iOS设备,以便独立地从一个App Group读取和写入多个值.
现在watchOS 2应用程序在Watch上本地运行,Watch Connectivity Framework取代了之前的通信选项,这似乎不再适用.但是,从我在参考文献中看到的内容来看,实现与WatchOS 1中使用Watch Connectivity相同的功能相当麻烦......
有没有其他选择让我创建某种容器/文件/数据库/我可以从我的Watch应用程序和相关的iOS应用程序访问和更新?
即使我退出了视图\ App,我也试图通过保存状态来完成我最喜欢的按钮.如果有人能告诉我我该怎么做,那将是很棒的,我正在使用Xcode 8并使用Swift 3进行编码.
//create a new button
let Favoritebutton: UIButton = UIButton(type: UIButtonType.custom)
//set image for button
Favoritebutton.setImage(UIImage(named: "EmptyHeart.png"), for: .normal)
Favoritebutton.setImage(UIImage(named: "FilledHeart.png"), for: .selected)
//add function for button
Favoritebutton.addTarget(self, action: #selector(self.button), for: .touchUpInside)
//set frame
Favoritebutton.frame = CGRect(x:0,y: 0,width: 35,height: 35)
Favoritebutton.isSelected = UserDefaults.standard.bool(forKey: "isSaved")
let barButton = UIBarButtonItem(customView: Favoritebutton)
//assign button to navigationbar
self.navigationItem.rightBarButtonItem = barButton
let state = UserDefaults.standard.bool(forKey: "isSaved") ?? false
}
@IBAction func button(sender: UIButton) {
sender.isSelected = !sender.isSelected
if let Favoritebutton = sender …Run Code Online (Sandbox Code Playgroud) UserDefaults上的操作是否同步?例如,第二次保存是否等待第一次保存完成?
UserDefaults.standard.set(myValue1, forKey: "myValue1")
UserDefaults.standard.set(myValue2, forKey: "myValue2")
Run Code Online (Sandbox Code Playgroud) nsuserdefaults ×10
objective-c ×5
ios ×4
iphone ×4
swift ×3
xcode ×3
cocoa ×2
delegates ×1
memory ×1
plist ×1
reset ×1
uialertview ×1
uibutton ×1
watchos-2 ×1