三十而立,從零開始學ios開發(十九):Application Settings and User Defaults(上

來源:互聯網
上載者:User

在iphone和ipad中,有一個東西大家一定很熟悉,那個東西就是Settings。

這次要學習的東西說白了很簡單,就是學習如何在Settings中對一個app的某些屬性進行設定,反過來,在app中更改了一些屬性值,也會反應到Settings中,這個功能很常用,實現起來也相對簡單,但是內容還是比較多的。

首先還是對Settings進行一個簡單的說明,雖然我們經常開啟Settings,但是很少對Settings進行過仔細的研究,不過作為一名ios的開發人員,有這個必要對Settings進行一番探索,看看Settings裡面到底包含了哪些東西,這些東西又是什麼。

首先我們開啟Settings,可以看到Settings的主介面(畫面截取自iphone模擬器)

可以看到,Settings的主介面是一個Table View,Style的屬性是Grouped。除了常見的General、Airplane Mode、Wi-Fi、Notifications等(後面3個未在中出現,開啟你的iphone,Settings裡面會有這些選項),iphone為每個有需要的app建立了一個cell,例如Twitter、Facebook等。點擊Twitter,即可以看到該app所包含的一些設定項。

Settings中的設定項是有限制的,一共可以包含以下4類:Text Field,Switch,Slider, TableView的checklist。
 

大家應該看出,Settings其實是一個Navigation Controller,View與View之間是繼承關係。

在說一下iOS中是以什麼方式來操作Settings的,這個東西叫做NSUserDefaults,它可以方便的在app與Settings進行互動,儲存更新值。

好了,簡單的介紹就到這裡,下面我們開始這次的例子,作完這個例子,相信會對Settings有更深的瞭解。

1)建立一個工程,左邊選擇Application,右邊選擇Utility Application,點擊Next按鈕

在Product Name中輸入AppSettings,然後選中Use Storyboards,點擊Next按鈕

點擊Create按鈕完成建立

觀察一下程式為我們自動建立的工程專案檔,裡面有一個很常見的BIDAppDelegate,另外我們剛才選中的Use Storyboard,因此有一個MainStoryboard.storyboard存在,除了這些,另外還有4個檔案,分別是BIDMainViewController和BIDFlipsideViewController,這個是Utility Application模板自動為我們建立的。

由於這是我們第一次使用Utility Application,因此在這裡做一些簡單的介紹,Utility Application會自動幫我們建立2個view,第一個view叫做main view,第二個view叫做flipside view,在main view上面有一個information button,點擊這個information button就會切換到flipside view。在flipside view的navigator bar上有一個Done按鈕,點擊這個Done按鈕,就會切換回main view。在Project navigator中選中MainStoryboard.storyboard,就會看見2這個view,而這2個view就分別對應著BIDMainViewController和BIDFlipsideViewController。

好了,下面我們需要添加一個Settings Bundle,如果你的一個app需要在Settings中進行設定,那麼在你的項目中一定要加Settings Bundle,這個東西的作用就是當你把你的app安裝到iphone上後,它會自動在Settings中添加與這個項目相關的一個條目(cell)用於設定。

2)添加Settings Bundle
選擇File>New>File...,在左邊的選擇Resource,右邊選擇Settings Bundle,點擊Next按鈕

保留預設的名字,點擊Create按鈕完成添加

展開Settings.bundle,有2個預設項,一個是en.lproj檔案夾(這個暫時忽略,使用者本地化程式的,現在無需理會),另一個是Root.plist,從尾碼名我們可以斷定,Settings中的項是基於Property list,也就是一個xml檔案。

選中Property list,在editor pane中會顯示如下內容

我們改變一下Root.list的顯示方式,在editor pane的任何地方點擊滑鼠右鍵,然後在彈出的菜單中選擇“Show Raw Keys/Values”

然後Root.plist會顯示如下樣子

最直觀的發現是2個Key的名字變了,“Preference Items”變成了“PreferenceSpecifiers”,“Strings Filename”變成了“StringsTable”,其實內容並沒有改變,只是顯示的方式不同,這個看個人喜好吧,前者名字比較通俗移動,後者名字更貼近實現情況。

另外,我們不必過多關注StringsTable,這個值是用在localization的時候的,因此在這裡你可以直接刪了它。

3)添加Settings中的控制項
添加Text Field

接著我們展開PerferenceSpecifiers,裡面有4個預設的Item,這些都是系統幫我們產生的,但是這些並不是我們這個例子想要的,所以,我們刪除Item 1、Item 2、Item 3,只保留Item 0。

(中我把StringsTable也刪了)

接著我們展開Item 0,看看裡面有些什麼的東西
 
裡面有一個Title和Type索引值對(也就是Dictionary),我們把注意力集中到Type,它的值是PSGroupSpecifier,說明這個item是一個group類型,在這個item之後的所有同級item,都是屬於這個group的,直到下一個group類型出現。在PreferenceSpecifiers下,必須要有至少一個group存在。Title用於設定這個group的名稱,這個屬性是可以省略的。

在觀察一下Item 0的顯示方式:Item 0 (Group - Group),括弧中第一個Group是只這個item的類型為PSGroupSpecifier,第二個Group是這個item的Title值。我們修改一下Title的值,設定其為“General Info”

設定完成後,你會發現Item 0的顯示變成了:Item 0 (Group - General Info)

PSGroupSpecifier並不是一個實際可以操作的類型,它的作用僅僅是把幾個相關的屬性包含在一起,形成一個table view中的group,下面我們添加可操作的節點。

首先將Item 0合攏,然後滑鼠選中Item 0的整行,單擊鍵盤上的return鍵,一個新的Item(Item 1)出現在Item 0的下方,並有一個列表彈出,讓你選擇這個Item的類型

在這裡我們選擇Text Field,建立完Item 1後,展開Item 1

可以看到一共有3個索引值對,Type的類型為PSTextFieldSpecifier,另外2個分別是Title和Key,將Title賦值為“Username”,將Key賦值為“username”(注意大小寫)。這裡的Key是用於儲存和擷取Item 1的值的,每一個Item你可以理解為是一個Dictionary,一個Dictionary就是一個索引值對,那麼這個Key的作用就是擷取或者儲存指定的值。(Item 0中並沒有Key,這個是因為Item 0的類型是PSGroupSpecifier,沒有需要儲存的值)

在這篇文章剛剛開始的時候,我們提到過NSUserDefaultes,NSUserDefaultes就是使用這個key來獲得item的值的,也是用這個key來儲存更新值的。

最後我們為Item 1再添加2個屬性,選中Item 1中最後一行(Key所在的行),然後按下鍵盤上的return,一個新的行出現在Key的下面,另外有一個list讓你選中Key的名字,這裡我們選擇“AutocapitalizationType”,然後設定值為“None”。同樣的方法再添加一次,這次選擇“AutocorrectionType”,然後設定值為“No”


“AutocapitalizationType”的意思是是否自動完成輸入,也就是說你輸入一個單詞的前幾個字,系統會出現一個列表,列表裡面會有相關的詞彙,你只有直接選中,就可以完成輸入了,這裡我們設定為“None”,無需自動完成。
“AutocorrectionType”的意思是自動糾正拼字,就是系統幫你建成你輸入的單詞是否有拼字錯誤,我們同樣把這個功能關掉了。

好了,儲存一下Root.plist。

到此為止,我們可以試著編譯運行程式了,為了使程式能夠在Settings中反白(好找一點),我們為程式添加一個表徵圖,先下載一個表徵圖icon,然後在Project navigator中選中根節點AppSettings,然後在左邊選擇TARGETS下的AppSettings,開啟Summary tab,展開iPhone / iPod Deployment Info,找到App Icons

將icon拖入到左邊的表徵圖中(右邊的是視網膜屏用的表徵圖,我們這裡沒有提供這個表徵圖,所以就空著吧)

好了,編譯運行一下程式,程式啟動後,按Home鍵回到案頭,然後進入Settings,在Settings主介面的最下面,可以找到我們建立的AppSettings程式表徵圖

點擊該表徵圖,就會進入這個程式的設定

中我們可以看到在Root.plist中我們設定的項還原出來的結果,首先是一個Group,Group的Title為General Info,然後在Group中是一個TextField的項,它的Title是Username。

OK,到此位置,你應該對Settings有所瞭解,知道裡面的項是怎麼產生的,每個項的屬性的作用等等。下面我們接著添加更多的不同類型的項,全面的對Settings進行操作。

3)添加其他的項
添加Secure Text Field
先將Item 1閉合,然後選中它,按鍵盤上的command+C,command+V,複製粘貼一份Item,一個新的Item 2會出現在Item 1的下面

展開Item 2,並將其下的屬性設定為下面的樣子

如所示,Item 2是用於接收密碼的,它的Type類型還是為PSTextFieldSpecifier,將它的Title設為Password,Key為password,這裡多了一個新的屬性叫做IsSecure,當將它的值設為YES時,那麼在文字框中內容就會以密碼的方式顯示。(你可以編譯運行一下,看看是不是這個密碼框的效果)

添加Multivalue Field
Multivalue Field會產生一個帶箭頭的cell,點擊該行後,會跳轉到下一個table view,下一個table view中會包含多個選項,使用者在多個選項中選取其中的一個,然後返回到前一個view,該cell中的內容就是使用者選取的內容。

我們合攏Item 2,然後選中Item 2,按return鍵建立Item 3,選擇Item 3的類型為Multi Value

展開Item 3,可以看到,Type的類型為PSMultiValueSpecifier。將Title設定為Protocol,Key設定為protocol。

ok,下面我們會添加一組Titles和Values,Titles儲存每一個選項的顯示值,Values中儲存每一個選項的id,他們是一一對應的。保持Item 3展開的形態,然後選中Item 3,按return鍵(在Item展開的形態下選中並按retuan鍵,是添加當前項的子項;在Item閉合的形態下選中幫按return鍵,是添加同級系項),會建立一個Item 3的子項並出現一個下拉框選中子項的類型,在這裡我們選擇Titles。

重複上面的動作,再建立一個Item 3的子項,並選擇Values。

選中Titles,然後點擊加號,添加一個子項,賦值為HTTP

重複這個動作,添加以下值SMTP,NNTP,IMAP,POP3

使用同樣的方法,為Values添加項,添加完後的樣子如下

Values和Titles不同之處在於一個是小寫一個是大寫,當然,如果你全部使用大寫或者小寫也是沒有問題的,看個人喜好了。

編譯運行一個程式

在Passwrod中輸入密碼,顯示的是一個一個的小圓點。Protocol項的右邊多了一個箭頭,點擊該項,跳轉到下一個view

這裡就是我們剛才添加的Titles的內容,我們隨意選中一個

選中SMTP後的狀態,然後我們點擊左上方的AppSettings按鈕返回上一級view

剛才選中的SMTP就顯示在Protocol項的右邊。

添加Toggle Switch Settings
Toggle Switch很簡單,就是一個switch,可以選擇開啟或者關閉,這個類型的目的是設定一個bool值。

合攏Item 3,然後選中,按return鍵,添加一個Item 4,並設定Item 4的類型為Toggle Switch,展開Item 4,設定Title為“Warp Drive”,Key為“warp”,將DefaultValue的值改為YES

好了,編譯運行一下,一個Switch出現在Protocol的下面

添加Slider Setting
Slider我們已經熟知,在Settings中,一個Slider可以在其2端各放置一副圖片(但我發現在iphone中放置圖片的例子不多),Slider本身沒有帶文字說明,我們也不可以在Settings中放置一個label告知使用者這個slider的作用是什麼,因此這裡的解決方案是添加一個新的Group,然後為Group添加文字說明,告知使用者slider的作用。

合攏Item 4,並選中,按return鍵,添加Item 5,選擇Item 5的類型為Group,並設定Title值為“Warp Factor”

合攏Item 5,並選中,按return鍵,添加Item 6,選擇Item 6的類型為Slider,根據設定Item 6的屬性

編譯運行一下程式,效果如下


剛才我們說了,Slider的兩端可以各添加一個圖片(圖片的大小為21 * 21 pixel),我們現在就來添加,先下載這裡的圖片

為slider添加image的方法有些特殊,我們並不是直接將圖片拖到project navigator中,然後放到slider中,Settings並沒有為我們提供這樣的方法。我們使用別的方法添加,首先在Project navigator中滑鼠右擊Settings.bundle,選擇Show in Finder

在Finder中右擊Settings.bundle,選擇“顯示包內容”(Show Package Contents)

然後將2張圖片複製進包裡面,然後在Project navigator中也能夠看見這2張圖片了

接著開啟Root.plist,在Item 6中添加2項Max Value Image Filename和Min Value Image Filename,為Max賦值rabbit,為Min賦值turtle
 

再次編譯運行,2張圖片出現在slider的左右2邊。

添加一個Child Settings View
這個意思就是單擊table view上的一個cell,跳轉到另一個Settings view。經過上面的一些講解,我們實際上都是在對plist進行操作,由此可以推斷出,所有的Settings都是以一個一個的plist檔案,因此如果要跳轉到另一個Settings view,那必須包含另一個plist,根據這個思路,我們進行下面的操作。

我們再建立一個Group,建立在Item 6的下面,並命名為Title

然後我們在Item 7的下面添加Item 8,按照之前的方式,現在我們應該設定Item 8的類型了,但是在預設的下拉框中並沒有我們需要的類型(Child Pane),不急,我們展開Item 8(在這裡確保你選擇了Show Raw Keys/Values),然後點擊其Type行的Value列最後邊的按鈕,會出現一個下拉框

在下拉框中選擇PSChildPaneSpecifier,這樣Item 8的類型就是一個Child Pane了。

接著設定Title為“More Settings”,Key空著,因為這是一個起到導航作用的Item,我們無需得到它的值,也就不需要它的Key了。

再接著我們選中最後一行Key,按return鍵添加一個,在下拉式功能表中選擇File

我們需要關聯一個plist檔案,這樣就可以導航到另一個Settings view了,下載這裡的More.plist,還記得剛才我們是如何為slider添加2個圖片的嗎?在Project navigator中滑鼠右擊Settings.bundle,然後選擇Show in Finder,在Finder中滑鼠右擊Setting.bundle,選擇Show Package Contents,將More.plist複製進去,這樣在Project navigator中就出現More.plist了。

由於More.plist是現成幫我們做好了,因為我們不需對其進行任何操作,直接用就可以了。編譯運行程式

Settings view的底部多了我們剛才添加的More Settings,點擊More Settings,跳轉到More.plist的Settings view

可以看到在More中前4個都是Text Field,最後一個是Mulitvalue Field,之後大家隨便點吧,反正也就這些東西了。

 

4)總結
到此為止,所有可以在Settings中添加的控制項都已經介紹了,總類不是很多,一共6種,而對於Settings的操作,也就是對一個plist檔案的操作,iOS系統會自動將plist中的內容反應到Settings上去,我們只需針對plist進行操作,就可以很簡單的完成Settings view的設定。在下一篇中,我們將把Settings中的值和真正的app程式串連起來,在Settings中設定值後,在app中會反應出來,在app中對一個值變更,在Settings中的這個值同樣會被更新,串連這兩個東西的橋樑就是之前提到的NSUserDefaults,我們在下一篇中進行詳細的介紹,謝謝!

 

AppSettings 

 

 

 

 

 

 

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.