應用設定Setting的實現

jiufreeman發表於2020-04-07

有很多應用都在iOS設定中有相關的設定,如下圖:

   

 

通過這個設定可以方便的對應用的一些基本的設定進行更改。

要完整的實現這個設定功能,有以下幾方面問題需要解決:

1)設定的編寫(實現設定的功能)

2)設定內容的儲存(保證設定經過更改後能立即生效。比如最小化應用,然後在設定中更改,重新開啟應用,應該顯示新的設定方式)

 

關於這方面的內容可以參考蘋果開發文件:Preferences and Settings Programming Guide

下面說一下實現過程:

 

STEP 1:編寫設定

通過Settings Bundle來實現。

1) 新建一個Settings Bundle:


建立好後可以看到如下內容:


我們可以看到,settings bundle裡面包含了兩個檔案,一個是Root.plist用於設定要設定的內容,另一個Root.strings用於多語言化。我們現在不考慮多語言化的內容,只看Root.plist的設定方法。

我們看到Root.plist檔案裡面已經預先有幾個item,這些就是要設定的內容。一共有7種型別:


這些很好理解,除了Child pane都是一些控制元件,只是這裡通過plist檔案來實現。Child pane是子頁面,可能相對麻煩一點。先說一下前面幾個。

 

首先看一下要的效果:


 

1)Group

設定如下:


2)Text Field

設定如下:


這裡的identifier就是之後儲存需要用到的Key,就是利用NSUserDefaults,之後介紹。

然後Text Field is Secure這個選項就是設定是否加密。其他都很容易理解。

3)Toggle Switch


4)Slider


可以新增左右圖片

5)Multi Value


設定如下:


 

下面介紹一下Child Pane的使用。

要新增新的設定頁面,需要建立新的plist。


上圖摘自開發文件,可以很清楚的看出結構。

因此我們需要建立新的plist檔案。

關鍵點在於我們不能在Xcode中建立,因為在Xcode中我們無法將檔案拉進bundle裡面,因此,最簡單的方法就是,開啟bundle的檔案管理器,然後複製Root.plist,再改名!!!


 

接下來是設定Child Pane:


filename就是新的plist的名稱,無需加字尾。

然後在Child.plist的編輯和Root.plist一樣。關鍵點在於為了編輯方便,應該將Child.plist的型別設定為iPhone Settings plist

 


OK,通過上面的方法,我們就可以在介面上完成需要的設定功能。下面是進行資料的操作。

 

STEP 2:使用NSUserDefaults實現preference的儲存。

首先明確的是上面的Setting的資料將儲存在NSUserDefaults中StandardDefaults當中,每個設定對應的identifier就是Key。

 

1)一般我們需要設定一些初始資料,也就是應用第一次開啟就能將資料進行初始預設設定。

程式碼:

 

[plain] view plaincopy
 
  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions  
  2. {  
  3.     // Override point for customization after application launch.  
  4.       
  5.     NSDictionary *defaults = @{kScreenAutoLock: @NO,  
  6.                                kSensitivityValue: @5};  
  7.     [[NSUserDefaults standardUserDefaults] registerDefaults:defaults];  
  8.     return YES;  
  9. }  


通過一個dictionary來進行設定。這裡的kScreenAutoLock是macro定義的key,就是identifier

 

2)在獲取資料

 

[plain] view plaincopy
 
  1. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];  
  2.   
  3. value = [defaults floatForKey:kSensitivityValue];  
  4. switch  = [defaults boolForKey:kScreenAutoLock];  


3)更改資料

 

 

[plain] view plaincopy
 
  1. NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];  
  2.   
  3. [defaults setFloat:5.0f forKey:kSensitivityValue];  
  4. [defaults synchronize];  


記住要使用synchronize來實現資料的儲存。

 

 

4)補充

單單使用上面的方法還不夠,存在的問題就是如果我們在設定中進行設定更改,那麼這是如果應用已啟動,開啟應用後資料因為沒有同步,還是設定前的資料。因此,在程式EnterForeground時候,應用應該進行資料的同步。

在使用中,就是通過notification,在EnterForeground時候同步更改的資料

程式碼:

 

[plain] view plaincopy
 
  1. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];  

 

[plain] view plaincopy
 
  1. - (void)applicationWillEnterForeground:(NSNotification *)notification  
  2. {  
  3.     [[NSUserDefaults standardUserDefaults] synchronize];  
  4.     [self refreshSettings]; // 更新設定顯示  
  5. }  


關於settings的內容就介紹到這。

相關文章