Ios 如何实现NSUserDefault以通过多个视图访问

Ios 如何实现NSUserDefault以通过多个视图访问,ios,ipad,nsuserdefaults,multiple-views,data-sharing,Ios,Ipad,Nsuserdefaults,Multiple Views,Data Sharing,我正在尝试在多个视图中共享字符串和整数,这是一个介绍性的iOS开发课程的最后一个项目,大约50个,我想知道我将如何做到这一点。。。我知道MVC模式是最好的,但我们没有得到非常先进的东西,尤其是核心数据。我在考虑使用NSUserDefaults,我知道这是错误的,但这个应用程序不必太快,我认为这对我来说是最简单的方法。我的问题是,在哪里以及如何声明我将使用的NSUserDefault对象?我们在课堂上唯一一次使用它是在一个视图中。如果我在加载的第一个视图中声明它,我知道我可以使用其他视图访问它,但

我正在尝试在多个视图中共享字符串和整数,这是一个介绍性的iOS开发课程的最后一个项目,大约50个,我想知道我将如何做到这一点。。。我知道MVC模式是最好的,但我们没有得到非常先进的东西,尤其是核心数据。我在考虑使用NSUserDefaults,我知道这是错误的,但这个应用程序不必太快,我认为这对我来说是最简单的方法。我的问题是,在哪里以及如何声明我将使用的NSUserDefault对象?我们在课堂上唯一一次使用它是在一个视图中。如果我在加载的第一个视图中声明它,我知道我可以使用其他视图访问它,但是我是否需要将第一个视图的头文件导入到其他视图中,或者不管如何都可以访问它


更新
因此,我想我应该在所有的
ViewControllers
中设置
NSUserDefaults
属性,让事情变得更简单。然后,为了尝试返回值,我将每个
ViewControllers
中的头实现到需要访问存储在NSUserDefaults中的数据的视图中(该视图还具有
NSUserDefaults
属性)。这个应用程序运行得非常好,直到我进入那个屏幕,没有任何更新。我确信我的错误在于如何实现
NSUserDefaults
,但我不确定如何正确实现它。当我们在课堂上检查它们时(实际上这是一项针对“Sam’s Teach Yourself iPhone Application Development in 24小时”(呕吐,让我很愤怒)的指导性研究),我们唯一一次使用它们是在一个单视图应用程序中,它改变了白色背景的alpha,因此可以用作闪光灯。它是这样呈现的:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
[userDefaults setInteger: var forKey: kVar];
[userDefaults synchronize];
这就是我在我的应用程序中尝试的:

在my
ViewController.h
文件中,每个视图: 然后,当我单击一个按钮时,我想将该值保存到
userDefaults

很抱歉,你们试图向我解释的内容显然完全超出了我的理解范围,而且我的命名约定有点混乱,但我已经连续15个小时在这方面工作了,几乎没有休息,现在是凌晨4点左右在明尼苏达州。我该怎么办?我也很抱歉,它可能需要明确说明如何实现它。

没有什么需要“声明”的。每次你说
[NSUserDefaults standardUserDefaults]
你都在访问用户默认值,不管你从哪里说。如果需要设置默认值(即某些键的初始值),请在程序中尽早设置,例如在应用程序代理的
applicationdFinishLaunching
中,通过调用
registerDefaults

NSUserDefaults
的好处是,您不需要在任何地方实例化它:它已经可以从应用程序中的任何地方访问。只需调用
[NSUserDefaults standardUserDefaults]
,并读取或写入该对象即可。调用对象上的
synchronize
,确保更改存储在磁盘上,然后在下一个检索
standardUserDefaults
对象的位置,它将具有更新的信息

编辑:根据上述代码,您可以进行以下更改以使用标准用户默认对象:

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.userDefaults = [NSUserDefaults standardUserDefaults];
}
  • 去掉你的
    @property(assign)NSUserDefaults用户默认值
    和您的成员变量
    NSUserDefaults userDefaults
  • 无论您要在何处读取或写入用户默认值,请创建一个临时变量:
    NSUserDefaults*userDefaults=[NSUserDefaults standardUserDefaults]
  • 另一种方法是将
    @属性
    设置为标准用户默认值对象,这样就不必通过调用
    标准用户默认值
    来检索它(因为您似乎经常使用它,这可能是您应该采取的方法)

    要这样做:

  • 保留您的
    @属性
    ,但将其设置为
    (保留)
    ,而不是
    (分配)
    标准用户默认值
    对象是
    自动释放
    d,因此您需要自己保留它)。(可选)您可以删除
    NSUserDefaults用户默认值行,因为
    @属性无论如何都会为您创建该行
  • 初始化视图控制器时(或在
    viewdiload
    中,就像我在这里所做的那样),将
    userDefaults
    变量设置为标准用户默认对象:

    - (void)viewDidLoad
    {
        [super viewDidLoad];
        self.userDefaults = [NSUserDefaults standardUserDefaults];
    }
    
  • 释放与初始化方法对应的方法中的用户默认变量(
    dealloc
    用于
    init
    方法,或
    viewDidLoad
    用于
    viewDidLoad
    ):


  • 如果您经常使用
    NSUserDefaults
    ,那么为自己创建一个类别可能会很方便,以确保您的密钥中不会出现打字错误。例如,假设我不断地获取和设置值,让编译器进行一些检查以确保我没有键入错误的键是很方便的,当然我们都喜欢自动完成

    // NSUserDefaults+PSProperties.h
    
    @interface NSUserDefaults (PSProperties)
    
    @property (nonatomic, assign) NSInteger ps_myInteger;
    
    @end
    
    // NSUserDefaults+PSProperties.m
    
    NSString * const PSKeyMyInteger = @"PSKeyMyInteger";
    
    @implementation NSUserDefaults (PSProperties)
    
    - (NSInteger)ps_myInteger;
    {
        return [self integerForKey:PSKeyMyInteger];
    }
    
    - (void)setPs_myInteger:(NSInteger)ps_myInteger;
    {
        [self setInteger:ps_myInteger forKey:PSKeyMyInteger];
    }
    
    @end
    
    因此,在使用用户默认值的其他类中,我可以执行以下操作:

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    
    defaults.ps_myInteger = 5;
    [defaults synchronize];
    
    NSLog(@"%i", defaults.ps_myInteger);
    
    > 2011-12-14 01:10:28.041 SampleUserDefaults[5356:f803] 5
    

    现在所有的键都被隐藏了,我使用与我的应用程序相关的更好的API与
    NSUserDefaults
    进行交互。

    你能举例说明如何做到这一点吗?我已经尝试了我能想到的一切,并在我的更新中记录了它,但仍然没有运气。
    - (void)viewDidUnload
    {
        self.userDefaults = nil;
    }
    
    // NSUserDefaults+PSProperties.h
    
    @interface NSUserDefaults (PSProperties)
    
    @property (nonatomic, assign) NSInteger ps_myInteger;
    
    @end
    
    // NSUserDefaults+PSProperties.m
    
    NSString * const PSKeyMyInteger = @"PSKeyMyInteger";
    
    @implementation NSUserDefaults (PSProperties)
    
    - (NSInteger)ps_myInteger;
    {
        return [self integerForKey:PSKeyMyInteger];
    }
    
    - (void)setPs_myInteger:(NSInteger)ps_myInteger;
    {
        [self setInteger:ps_myInteger forKey:PSKeyMyInteger];
    }
    
    @end
    
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    
    defaults.ps_myInteger = 5;
    [defaults synchronize];
    
    NSLog(@"%i", defaults.ps_myInteger);
    
    > 2011-12-14 01:10:28.041 SampleUserDefaults[5356:f803] 5