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
(因为想要一个更好的名字)并赋予它属性 id
和 name
。现在唯一需要担心数据保存和加载位置的是 '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]
我有几个对象存储在用户的 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
(因为想要一个更好的名字)并赋予它属性 id
和 name
。现在唯一需要担心数据保存和加载位置的是 '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]