天天看點

使用Settings Bundle為程式添加設定項建立一個Demo來學習一個Setting Bundle為程式存儲設定項實作步驟:

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向其中添加控件,如下圖:

使用Settings Bundle為程式添加設定項建立一個Demo來學習一個Setting Bundle為程式存儲設定項實作步驟:

然後為這些标簽向FirstViewController.h中建立Outlet映射:

使用Settings Bundle為程式添加設定項建立一個Demo來學習一個Setting Bundle為程式存儲設定項實作步驟:

3、打開MoreViewController.xib,向其中添加控件,如下:

使用Settings Bundle為程式添加設定項建立一個Demo來學習一個Setting Bundle為程式存儲設定項實作步驟:

然後,向MoreViewController.h中,為右邊的兩個Label以及UISlider與UISWitch控件建立Outlet映射,為UISlider與UISWitch控件添加Action映射:

使用Settings Bundle為程式添加設定項建立一個Demo來學習一個Setting Bundle為程式存儲設定項實作步驟:

然後在Attribute Insepector中設定UISlider控件最小值、最大值和預設值分别是0、10和5:

使用Settings Bundle為程式添加設定項建立一個Demo來學習一個Setting Bundle為程式存儲設定項實作步驟:

将準備好的兩張圖檔添加到工程中,在Attribute Insepector中設定UISlider控件的Min Image與Max Image:

使用Settings Bundle為程式添加設定項建立一個Demo來學習一個Setting Bundle為程式存儲設定項實作步驟:

4、接下來,為程式建立Settings Bundle。依次選擇File — New — File…,找到Settings Bundle:

使用Settings Bundle為程式添加設定項建立一個Demo來學習一個Setting Bundle為程式存儲設定項實作步驟:

單擊Next,設定好名稱和分組:

使用Settings Bundle為程式添加設定項建立一個Demo來學習一個Setting Bundle為程式存儲設定項實作步驟:

然後單擊Create,則建立了Settings.bundle。

5、展開Settings.bundle,其中包含一個Root.plist。Settings程式中的顯示項就是從Root.plist中擷取的。

單擊Root.plist以打開它,在空白處單擊,選中Show Raw Keys/Values:

使用Settings Bundle為程式添加設定項建立一個Demo來學習一個Setting Bundle為程式存儲設定項實作步驟:

接下來,我們展開PreferenceSpecifiers那一項,删除除了Group之外的其他項。

PreferenceSpecifiers這個對應于剛打開Settings程式時第一頁中該應用程式的一個标簽,如果此時運作程式,然後在模拟器傳回桌面,再打開Settings程式,則其中會出現Settings Bundle Test這一項:

使用Settings Bundle為程式添加設定項建立一個Demo來學習一個Setting Bundle為程式存儲設定項實作步驟:

上圖中的Settings Bundle Test這一項就可以了解為是從PreferenceSpecifiers擷取的。

6、展開PreferenceSpecifiers這一項,先向其中添加三行,每一行的設定如下:

使用Settings Bundle為程式添加設定項建立一個Demo來學習一個Setting Bundle為程式存儲設定項實作步驟:

此時運作程式,在Settings程式中單擊上圖中的Settings Bundle Test那一項,出現的頁面如下圖:

使用Settings Bundle為程式添加設定項建立一個Demo來學習一個Setting Bundle為程式存儲設定項實作步驟:
使用Settings Bundle為程式添加設定項建立一個Demo來學習一個Setting Bundle為程式存儲設定項實作步驟:

在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 Bundle為程式添加設定項建立一個Demo來學習一個Setting Bundle為程式存儲設定項實作步驟:

再運作程式,打開Settings程式看看:

使用Settings Bundle為程式添加設定項建立一個Demo來學習一個Setting Bundle為程式存儲設定項實作步驟:
使用Settings Bundle為程式添加設定項建立一個Demo來學習一個Setting Bundle為程式存儲設定項實作步驟:

8、之後,我們實作在上面左圖的下方出現一項“更多設定”,單擊此項跳轉到新的頁面。先建立一個plist檔案,名稱為MoreSettings.plist,建立方法就不說了吧,參考http://my.oschina.net/plumsoft/blog/42084第二步。注意現在隻是建立到工程中而不是Settings.bundle中,想要加到Settings.bundle中還要其他操作,稍後詳解。

右擊Settings.bundle,選擇Show in Finder:

使用Settings Bundle為程式添加設定項建立一個Demo來學習一個Setting Bundle為程式存儲設定項實作步驟:

然後在Finder中右擊Settings.bundle,選擇“顯示包含内容”:

使用Settings Bundle為程式添加設定項建立一個Demo來學習一個Setting Bundle為程式存儲設定項實作步驟:

在打開的地方将MoreSettings.plist以及上面用到的兩張圖檔拷貝進去。

9、編輯Settings.bundle中的MoreSettings.plist内容如下:

使用Settings Bundle為程式添加設定項建立一個Demo來學習一個Setting Bundle為程式存儲設定項實作步驟:

儲存後,在Root.plist添加一行:

使用Settings Bundle為程式添加設定項建立一個Demo來學習一個Setting Bundle為程式存儲設定項實作步驟:

注意,Item 8的類型是通過選擇其子選項Type的類型改變的。

此時運作程式,Settings程式如下:

使用Settings Bundle為程式添加設定項建立一個Demo來學習一個Setting Bundle為程式存儲設定項實作步驟:
使用Settings Bundle為程式添加設定項建立一個Demo來學習一個Setting Bundle為程式存儲設定項實作步驟:

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為程式添加設定項建立一個Demo來學習一個Setting Bundle為程式存儲設定項實作步驟:
使用Settings Bundle為程式添加設定項建立一個Demo來學習一個Setting Bundle為程式存儲設定項實作步驟:

傳回Settings Bundle Test程式,顯示如下:

使用Settings Bundle為程式添加設定項建立一個Demo來學習一個Setting Bundle為程式存儲設定項實作步驟:
使用Settings Bundle為程式添加設定項建立一個Demo來學習一個Setting Bundle為程式存儲設定項實作步驟:

不過,第一次運作程式時,單擊“更多設定”按鈕,Slider與Switch是變形的,然後才會顯示正确的值:

使用Settings Bundle為程式添加設定項建立一個Demo來學習一個Setting Bundle為程式存儲設定項實作步驟:

真是好事多磨啊。

剛運作程式,第一次單擊“更多設定”按鈕就會出現上圖情況。猜想是因為剛開始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: