有很多應用都在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的內容就介紹到這。