我们可以使用 NSUserdefaults 检测应用程序的首次启动。但是有什么方法可以检测 iOS 中的每日首次启动吗?我需要每天一次显示一个弹出窗口。
我正在尝试实现RawRepresentable和Measurement<UnitMass>,UnitMass以便用@AppStorage装饰器替换以下代码:
var unitOfMeasure: UnitMass {
get { AppSettings.defaults.string(forKey: "unitOfMeasure").flatMap { UnitMass.fromSymbol(rawValue: $0) }! }
set { AppSettings.defaults.set(newValue.symbol, forKey: "unitOfMeasure") }
}
var weightOverwrite: Measurement<UnitMass> {
get { .init(value: AppSettings.defaults.double(forKey: "weightOverwrite"), unit: unitOfMeasure) }
set { AppSettings.defaults.set(newValue.value, forKey: "weightOverwrite") }
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?我使用 JSONEncoder/JSONDecoder 实现了它:
extension Measurement: RawRepresentable {
public init?(rawValue: String) {
guard let data = rawValue.data(using: .utf8),
let result = try? JSONDecoder().decode(Measurement.self, from: data)
else {
return nil
}
self = result …Run Code Online (Sandbox Code Playgroud) 我使用以下代码从设置视图中保存值,该视图从UITextField获取值并使用NSUserDefaults存储它们.下面的代码甚至调用同步,但它没有保存更改.我在这做错了什么?
- (IBAction)save {
NSLog(@"save");
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
if (self.usernameTextField.text != nil) {
NSLog(@"username: %@", self.usernameTextField.text);
[defaults setObject:kTwitterUsernameKey forKey:self.usernameTextField.text];
}
if (self.passwordTextField.text != nil) {
NSLog(@"password: %@", self.passwordTextField.text);
[defaults setObject:kTwitterPasswordKey forKey:self.passwordTextField.text];
}
[defaults synchronize];
[self dismissModalViewControllerAnimated:TRUE];
}
Run Code Online (Sandbox Code Playgroud) 我上了课.这是h文件.
// MyClass.h
#import <Foundation/Foundation.h>
@interface MyClass : NSObject <NSCoding> {
NSString *string1;
NSString *string2;
}
@property (nonatomic, retain) NSString *string1;
@property (nonatomic, retain) NSString *string2;
@end
Run Code Online (Sandbox Code Playgroud)
这是m文件.
// MyClass.m
#import "MyClass.h"
@implementation MyClass
@synthesize string1, string2;
- (void)encodeWithCoder:(NSCoder *)coder;
{
if (self = [super init]){
[coder encodeObject:string1 forKey:@"string1"];
[coder encodeObject:string2 forKey:@"string2"];
}
}
- (id)initWithCoder:(NSCoder *)coder;
{
self = [[MyClass alloc] init];
if (self != nil)
{
string1 = [coder decodeObjectForKey:@"string1"];
string2 = [coder decodeObjectForKey:@"string2"];
}
return self;
} …Run Code Online (Sandbox Code Playgroud) 我知道这似乎应该这么简单......
我从NSUserDefaults中提取字符串值:
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
NSString *strFirstName = [userDefaults stringForKey:kFirstPersonName];
Run Code Online (Sandbox Code Playgroud)
这给了我"指针和整数之间的比较"错误:
if (!strFirstName == nil) {
self.firstPersonName.text = strFirstName;
}
Run Code Online (Sandbox Code Playgroud)
我要做的是从用户默认值中提取一个值.如果没有,请不要使用它.如果它有一个字符串值,请使用它.
任何帮助表示赞赏!LQ
我有这个方法来保存一个名为myWallet的可变数组,该数组包含Class Card的实例.
- (void)saveMyWallet
{
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:[NSKeyedArchiver archivedDataWithRootObject:self.myWallet] forKey:@"myWalletArray"];
[defaults synchronize];
}
Run Code Online (Sandbox Code Playgroud)
我有的卡类有三个实例变量:名称,引脚和点.到目前为止,在UserDefaults中保存卡的新实例是可以的.我只是想知道我如何能覆盖点的值,因为正如我在点的计算进行,我想更新它的一些建议.
这是我的卡类
Card.h
#import <Foundation/Foundation.h>
@interface Card : NSObject <NSCoding>
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *pin;
@property (nonatomic, strong) NSNumber *points;
@property (nonatomic, strong) NSMutableArray *pointsToDeduct;
- (double) subtractPoints: (double) requiredPoints;
- (void) encodeWithCoder:(NSCoder *)coder;
- (id) initWithCoder: (NSCoder *)coder;
@end
Run Code Online (Sandbox Code Playgroud)
Card.m
#import "Card.h"
@implementation Card
@synthesize name = _name;
@synthesize pin = _pin;
@synthesize points = _points;
@synthesize …Run Code Online (Sandbox Code Playgroud) 我试图将NSInteger(标签)保存到NSUserDefaults但我还没有找到一种方法来做到这一点甚至可能
保存数据
[[NSUserDefaults standardUserDefaults] setInteger:label forKey:@"key1"];
Run Code Online (Sandbox Code Playgroud)
检索数据
- (void)viewDidLoad {
label = [[NSUserDefaults standardUserDefaults] integerForKey:@"key1"];
[super viewDidLoad];
Run Code Online (Sandbox Code Playgroud) 我之前使用过NSUserDefaults,为我的应用程序的设置部分存储了一些变量.
但是现在我正在制作一个食谱应用程序,用户可以在其中键入自己的食谱并保存它们.每个食谱都有一个标题描述日期等.所以我想我需要一个数组来保存每个食谱.但是,我将如何动态添加每个新配方?
我的意思是我会开始将配方保存在阵列的下一个位置?如果用户删除一个食谱并且数组中有一个空位,会发生什么?
我的逻辑在保存数据方面是正确的吗?你会怎么做?
我有一个应用程序,其中我保存的阵列CNContact,以UserDefaults作为这样的:
var contactsArray = [CNContact]()
let defaults = UserDefaults()
func (contact: CNContact){
contactsArray.append(contact)
let contactArrayArchive = NSKeyedArchiver.archivedData(withRootObject: contactArray) //archive the data
defaults.set(contactArrayArchive, forKey: "contactArray")
defaults.synchronize()
}
Run Code Online (Sandbox Code Playgroud)
这会归档数据以允许将其保存到defaults.我的问题是我怎么能这样的数据转换回阵列CNContact中viewDidLoad.我在网上看到很多答案,建议使用NSKeyedArchiver.unarchiveObjectwithData但是在Xcode中键入这个,swift 3,表示它.unarchiveObjectwithData不是.的成员NSKeyedArchiver.我一直在寻找有关如何在swift 3中执行此操作的内容,但一直未成功.我怎样才能解除价值?
按照惯例,在处理时UserDefaults,我们使用standard它的对象。但是,使用标准UserDefaults应该设置/获取可从新实例访问的值,反之亦然。澄清:
let object = UserDefaults()
object.set(101, forKey: "number1") // setting via a new object
UserDefaults.standard.integer(forKey: "number1") // getting via standard
// 101
UserDefaults.standard.set(102, forKey: "number2") // setting via standard
object.value(forKey: "number2") // getting via the new object
// 102
Run Code Online (Sandbox Code Playgroud)
我会假设它standard不以“语法糖”形式存在,仅为此目的创建单例类似乎并不明智。
所以:
standard代替有好处UserDefaults()吗?如果有,那是什么?可能与套房有关吗?UserDefaults()呢?nsuserdefaults ×10
ios ×4
objective-c ×3
swift ×3
iphone ×2
xcode ×2
cocoa-touch ×1
crash ×1
decorator ×1
nsarray ×1
nsdate ×1
nsinteger ×1
null ×1
userdefaults ×1