Settings Bundle是在自己的程式中建立的一組檔案,利用它可以告訴裝置中的Settings程式我們寫的程式有哪些設定項。使用者在Settings程式中設定好相關相關選項後回到我們自己的程式,自己的程式中的對應項也會發生相應的變化。
在iOS程式中,使用者預設項,即上面所說的設定項,是用NSUserDefaults類實作的。在NSUserDefaults類中使用關鍵字來讀取和存儲設定項的具體資料,就像NSDictionary類一樣,不同的是,NSUserDefaults類的資料是存儲在檔案系統中的,而不是作為一個對象執行個體放在記憶體中。
在這篇文章中,我們将建立一個程式,為它添加和配置Settings Bundle,之後可以在Settings程式中顯示和配置相關選項。在Settings Bundle中使用plist檔案來定義程式中允許的設定項,Settings程式會自動建立接口。Settings Bundle中的plist檔案必須遵循特定的格式,不過Xcode會幫助我們遵循這種格式。
由于我們的重點是Settings Bundle的使用,那麼建立工程、實作頁面跳轉等等就不詳細說明了。
2、解壓Settings Bundle Test.zip,使用Xcode 4.3打開此工程,先打開FirstViewController.xib,使用IB向其中添加控件,如下圖:

然後為這些标簽向FirstViewController.h中建立Outlet映射:
3、打開MoreViewController.xib,向其中添加控件,如下:
然後,向MoreViewController.h中,為右邊的兩個Label以及UISlider與UISWitch控件建立Outlet映射,為UISlider與UISWitch控件添加Action映射:
然後在Attribute Insepector中設定UISlider控件最小值、最大值和預設值分别是0、10和5:
将準備好的兩張圖檔添加到工程中,在Attribute Insepector中設定UISlider控件的Min Image與Max Image:
4、接下來,為程式建立Settings Bundle。依次選擇File — New — File…,找到Settings Bundle:
單擊Next,設定好名稱和分組:
然後單擊Create,則建立了Settings.bundle。
5、展開Settings.bundle,其中包含一個Root.plist。Settings程式中的顯示項就是從Root.plist中擷取的。
單擊Root.plist以打開它,在空白處單擊,選中Show Raw Keys/Values:
接下來,我們展開PreferenceSpecifiers那一項,删除除了Group之外的其他項。
PreferenceSpecifiers這個對應于剛打開Settings程式時第一頁中該應用程式的一個标簽,如果此時運作程式,然後在模拟器傳回桌面,再打開Settings程式,則其中會出現Settings Bundle Test這一項:
上圖中的Settings Bundle Test這一項就可以了解為是從PreferenceSpecifiers擷取的。
6、展開PreferenceSpecifiers這一項,先向其中添加三行,每一行的設定如下:
此時運作程式,在Settings程式中單擊上圖中的Settings Bundle Test那一項,出現的頁面如下圖:
在Root.plist檔案中,Item 0那一項的類型是PSGroupSpecifier,它表示一個分組,則它下面的每Item 1到Item 3都是在這一組,直到下一個PSGroupSpecifier出現。
Item 1與Item 2都是PSTextFieldSpecifier類型的,它們都是文本框,可以通過為其添加子項限制這些文本框的輸入。
Item 3是一個多選框,可供選擇的值是由Titles與Values決定的,Titles與Values這兩項内容是一樣的,但是缺一不可。
7、之後,再向其中添加Item 4到Item 7,如下圖:
再運作程式,打開Settings程式看看:
8、之後,我們實作在上面左圖的下方出現一項“更多設定”,單擊此項跳轉到新的頁面。先建立一個plist檔案,名稱為MoreSettings.plist,建立方法就不說了吧,參考http://my.oschina.net/plumsoft/blog/42084第二步。注意現在隻是建立到工程中而不是Settings.bundle中,想要加到Settings.bundle中還要其他操作,稍後詳解。
右擊Settings.bundle,選擇Show in Finder:
然後在Finder中右擊Settings.bundle,選擇“顯示包含内容”:
在打開的地方将MoreSettings.plist以及上面用到的兩張圖檔拷貝進去。
9、編輯Settings.bundle中的MoreSettings.plist内容如下:
儲存後,在Root.plist添加一行:
注意,Item 8的類型是通過選擇其子選項Type的類型改變的。
此時運作程式,Settings程式如下:
10、接下來都是代碼了。
10.1 在ViewController.h中添加代碼:
10.2 在FirstViewController.h與MoreViewController.h中分别聲明一個方法,名為
在FirstViewController.m中添加代碼如下:
在MoreViewController.m中添加代碼如下:
10.3 實作MoreViewController.m中的sliderTapped與switchTapped方法如下:
10.4 在FirstViewController.m與MoreViewController.m中@end之前都添加代碼:
10.5 在FirstViewController.m與MoreViewController.m的viewDidLoad方法中都添加代碼:
10.6 在FirstViewController.m與MoreViewController.m中的ViewDidUnload方法中都添加代碼:
11.7 在ViewController.m的viewDidLoad方法中的[super viewDidLoad];之前添加代碼:
11、運作,那麼Settings Bundle Test程式中的資料将會随着Settings程式中的選項改變而改變,反過來也是。
例如,在Settings程式中設定如下:
傳回Settings Bundle Test程式,顯示如下:
不過,第一次運作程式時,單擊“更多設定”按鈕,Slider與Switch是變形的,然後才會顯示正确的值:
真是好事多磨啊。
剛運作程式,第一次單擊“更多設定”按鈕就會出現上圖情況。猜想是因為剛開始ViewController中的moreViewController為空,在頁面跳轉時才建立它。為此,試試在ViewController.m的viewDidLoad方法的最後一條語句之前添加代碼:
再運作試試,還是不行。那估計是跟頁面跳轉時的動态效果有關了。再把ViewController.m的switchViews方法修改如下:
再運作,問題總算解決了。
-------------------------------------------------------------------------------------
另外一個demo實作步驟:
1.建立一個Utility Application。
2.同樣建立Settings Bundle檔案。
3.點選Root.plist->showRowKeys/Values,看看對應的每個key值,後面在代碼預定義的時候要寫的key跟這個要一模一樣的,NSUserDefault中自動建立的檔案,必須要等setting或者view中相應的值改了以後才能産生一個key/value記錄。
4.修改MainViewController中的代碼
MainViewController.h:
MainViewController.m: