[英]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的開頭都使用這10-12行完全相同的代碼。
編寫一個實用程序類。 並創建一些類方法。
一種方法可以像
+ (NSString *)choosenName {
return [[NSUserDefaults standardUserDefaults] valueForKey:@"chosen_name"];
}
然后調用方法,
chosenName = [Your_Utility_Class choosenName];
是的,您可以通過以下簡單方法全局實現它。創建NSObject類,請參考下面的示例。
.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方法一樣不使用alloc init進行訪問。
在Viewcontroller中設置
[NSDefaultSession SetEmail:@"YourString"];
[NSDefaultSession SetFirstName:@"YourString"];
現在從任何ViewController獲取會話
[NSDefaultSession GetEmail]
[NSDefaultSession GetFirstName]
首先,您應該將這些值放入對象中,然后使用依賴項注入。
因此,首先創建一個類Chosen
(因為Chosen
更好的名稱),並為其賦予屬性id
和name
。 現在,唯一需要擔心數據保存位置和加載位置的是“選擇”對象,其他所有內容都將通過該對象。
現在,依賴注入。 您希望您的VC依賴關系清晰明了,不要依賴隱藏在其中的NSUserDefaults之類的單例。 因此,將.chosen設為需要訪問該對象的每個VC的公共屬性。
在application:application didFinishLaunchingWithOptions:
初始化此對象,然后將其注入到初始viewController中。 (即設置公共財產)
現在,通過注入到需要訪問它的每個其他viewController,再次傳遞該對象。
在我的選擇:
創建commonClass(NSObject類的子類)
裝箱備用方法,並在需要的地方使用它們。
例如:
在ur vc1中:
設置ur對象的值
chosenID = [[[NSUserDefaults standardUserDefaults] valueForKey:@"chosen_xxxx"] integerValue];
chosenName = [[NSUserDefaults standardUserDefaults] valueForKey:@"chosen_name"];
在我們的普通班上:
+(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];
這是解決此問題的正確方法。 子類的全部功能是通用的-視圖控制器是一種特定類型的視圖控制器,需要訪問這些變量。
這些變量現在可以在所有視圖控制器中神奇地(並且始終如一地)可用,而無需任何代碼重復。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.