iOS - 处理来自 NSUserDefaults 的全局应用程序变量

iOS - handle global app variables from NSUserDefaults

我有几个对象存储在用户的 NSUserDefaults 中,我必须或多或少地在我的应用程序的每个 ViewController 中使用它们。

目前,我基本上声明了相同的 3 个变量,并且在 viewDidLoad 中我将它们初始化为:

if(....){
     chosenID = [[[NSUserDefaults standardUserDefaults] valueForKey:@"chosen_xxxx"] integerValue];
     chosenName = [[NSUserDefaults standardUserDefaults] valueForKey:@"chosen_name"];
}else{
     chosenID = [[[NSUserDefaults standardUserDefaults] valueForKey:@"chosen_xxxx_2nd option"] integerValue];
     ...
}

我正在清理我的代码并优化我的代码,我想知道处理这种情况的正确方法是什么,以避免在每个单曲的开始 ViewController.

编写实用程序class。并创建一些 class 方法。

一种方法可以是,

+ (NSString *)choosenName {
    return [[NSUserDefaults standardUserDefaults] valueForKey:@"chosen_name"];
}

然后像这样调用方法,

chosenName = [Your_Utility_Class choosenName];

首先你应该把这些值放到一个对象中,其次使用依赖注入。

所以首先创建一个 class Chosen(因为想要一个更好的名字)并赋予它属性 idname。现在唯一需要担心数据保存和加载位置的是 'Chosen' 对象,其他一切都会通过它。

好的,依赖注入。你希望你的 VC 依赖关系是明显和清晰的,不要依赖像 NSUserDefaults 这样隐藏在它们里面的单例。因此,在每个需要访问对象的 VC 上选择一个 public 属性。

application:application didFinishLaunchingWithOptions: 中初始化此对象,现在将其注入到您的初始 viewController 中。 (即设置 public 属性)

现在只需通过注入将对象再次传递给需要访问它的每个其他 viewController。

在我的选项中:

创建 commonClass(NSObject class 的子 class)

打包备用方法并在需要的地方使用它们。

例如:

在你的 vc1 中:

设置你的对象的值

chosenID = [[[NSUserDefaults standardUserDefaults] valueForKey:@"chosen_xxxx"] integerValue];
     chosenName = [[NSUserDefaults standardUserDefaults] valueForKey:@"chosen_name"];

在你的共同 class:

+(NSString *) chosenID{
    NSUserDefaults *serverDefults=[NSUserDefaults standardUserDefaults];
    NSString * chosenID =[serverDefults objectForKey:@"chosen_xxxx"];
    if (chosenID.length==0) {
              // do some actions 
            }
    return chosenID;
}

在另一个VC2中:

 NSString *id =[commonClass chosenID];

这是解决这个问题的正确方法。通用功能是 sub-classing 的全部内容 - 您的视图控制器是需要访问这些变量的特定类型的视图控制器。

  • 创建 class BaseViewController,它是 UIViewController 的子class。
  • 为 BaseViewController 提供两个 public 属性,称为 chosenId 和 chosenName。
  • 在BaseViewController的viewDidLoad中添加你的初始化代码。
  • 从每个现有的视图控制器中删除初始化代码。
  • 制作任何需要这些类型变量的视图控制器,而不是 UIViewController 类型的 BaseViewController。

这些变量现在可以在所有视图控制器中神奇地(并且一致地)可用,而无需 任何 代码重复。

是的,您可以通过以下简单的 method.Create NSObject class 全局实现它,请参考下面的示例。

.h 文件

 //Setting up Session
  +(void)SetEmail:(NSString*)value;
  +(void)SetFirstName:(NSString*)value;

 //Retrieve
  +(NSString*)GetEmail;
  +(NSString*)GetFirstName;

.m 文件

 +(void)SetEmail:(NSString *)value{

        [[NSUserDefaults standardUserDefaults] setObject:value forKey:@"EMAILID"];
    }

    +(void)SetFirstName:(NSString *)value{

        [[NSUserDefaults standardUserDefaults] setObject:value forKey:@"FIRSTNAME"];

    }

 +(NSString*)GetEmail{
        return [[NSUserDefaults standardUserDefaults] stringForKey:@"EMAILID"];
    }

    +(NSString*)GetFirstName{
        return [[NSUserDefaults standardUserDefaults] stringForKey:@"FIRSTNAME"];
    }

现在移动到 Viewcontroller 并在没有分配初始化的情况下访问,因为它在 Class method.I 正在从结果设置。

设置在Viewcontroller

[NSDefaultSession SetEmail:@"YourString"];
[NSDefaultSession SetFirstName:@"YourString"];

现在从任何 ViewController

获取会话
[NSDefaultSession GetEmail]
[NSDefaultSession GetFirstName]