有很多應用都在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)一般我們需要設定一些初始資料,也就是應用第一次開啟就能將資料進行初始預設設定。
程式碼:
- - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
- {
- // Override point for customization after application launch.
- NSDictionary *defaults = @{kScreenAutoLock: @NO,
- kSensitivityValue: @5};
- [[NSUserDefaults standardUserDefaults] registerDefaults:defaults];
- return YES;
- }
通過一個dictionary來進行設定。這裡的kScreenAutoLock是macro定義的key,就是identifier
2)在獲取資料
- NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
- value = [defaults floatForKey:kSensitivityValue];
- switch = [defaults boolForKey:kScreenAutoLock];
3)更改資料
- NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
- [defaults setFloat:5.0f forKey:kSensitivityValue];
- [defaults synchronize];
記住要使用synchronize來實現資料的儲存。
4)補充
單單使用上面的方法還不夠,存在的問題就是如果我們在設定中進行設定更改,那麼這是如果應用已啟動,開啟應用後資料因為沒有同步,還是設定前的資料。因此,在程式EnterForeground時候,應用應該進行資料的同步。
在使用中,就是通過notification,在EnterForeground時候同步更改的資料
程式碼:
- [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillEnterForeground:) name:UIApplicationWillEnterForegroundNotification object:nil];
- - (void)applicationWillEnterForeground:(NSNotification *)notification
- {
- [[NSUserDefaults standardUserDefaults] synchronize];
- [self refreshSettings]; // 更新設定顯示
- }
關於settings的內容就介紹到這。