簡體   English   中英

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的開頭都使用這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更好的名稱),並為其賦予屬性idname 現在,唯一需要擔心數據保存位置和加載位置的是“選擇”對象,其他所有內容都將通過該對象。

現在,依賴注入。 您希望您的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];

這是解決此問題的正確方法。 子類的全部功能是通用的-視圖控制器是一種特定類型的視圖控制器,需要訪問這些變量。

  • 創建類BaseViewController,它是UIViewController的子類。
  • 為BaseViewController提供兩個公共屬性,分別稱為selectedId和selectedName。
  • 將您需要的初始化代碼添加到BaseViewController的viewDidLoad中。
  • 從每個現有視圖控制器中刪除初始化代碼。
  • 使所有需要這些變量的View Controller的UIViewController類型為BaseViewController。

這些變量現在可以在所有視圖控制器中神奇地(並且始終如一地)可用,而無需任何代碼重復。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM