十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
在iphone和ipad中,有一個(gè)東西大家一定很熟悉,那個(gè)東西就是Settings
。

這次要學(xué)習(xí)的東西說白了很簡單,就是學(xué)習(xí)如何在Settings中對一個(gè)app的某些屬性進(jìn)行設(shè)置,反過來,在app中更改了一些屬性值,也會(huì)反應(yīng)到Settings中,這個(gè)功能很常用,實(shí)現(xiàn)起來也相對簡單,但是內(nèi)容還是比較多的。
首先還是對Settings進(jìn)行一個(gè)簡單的說明,雖然我們經(jīng)常打開Settings,但是很少對Settings進(jìn)行過仔細(xì)的研究,不過作為一名ios的開發(fā)人員,有這個(gè)必要對Settings進(jìn)行一番探索,看看Settings里面到底包含了哪些東西,這些東西又是什么。
首先我們打開Settings,可以看到Settings的主界面(畫面截取自iphone模擬器)

可以看到,Settings的主界面是一個(gè)Table View,Style的屬性是Grouped。除了常見的General、Airplane Mode、Wi-Fi、Notifications等(后面3個(gè)未在截圖中出現(xiàn),打開你的iphone,Settings里面會(huì)有這些選項(xiàng)),iphone為每個(gè)有需要的app創(chuàng)建了一個(gè)cell,例如Twitter、Facebook等。點(diǎn)擊Twitter,即可以看到該app所包含的一些設(shè)置項(xiàng)。
Settings中的設(shè)置項(xiàng)是有限制的,一共可以包含以下4類:Text Field,Switch,Slider, TableView的checklist。

大家應(yīng)該看出,Settings其實(shí)是一個(gè)Navigation Controller,View與View之間是繼承關(guān)系。
在說一下iOS中是以什么方式來操作Settings的,這個(gè)東西叫做NSUserDefaults,它可以方便的在app與Settings進(jìn)行交互,保存更新值。
好了,簡單的介紹就到這里,下面我們開始這次的例子,作完這個(gè)例子,相信會(huì)對Settings有更深的了解。
1)創(chuàng)建一個(gè)工程,左邊選擇Application,右邊選擇Utility Application,點(diǎn)擊Next按鈕

在Product Name中輸入AppSettings,然后選中Use Storyboards,點(diǎn)擊Next按鈕

點(diǎn)擊Create按鈕完成創(chuàng)建

觀察一下程序?yàn)槲覀冏詣?dòng)創(chuàng)建的工程項(xiàng)目文件,里面有一個(gè)很常見的BIDAppDelegate,另外我們剛才選中的Use Storyboard,因此有一個(gè)MainStoryboard.storyboard存在,除了這些,另外還有4個(gè)文件,分別是BIDMainViewController和BIDFlipsideViewController,這個(gè)是Utility Application模板自動(dòng)為我們創(chuàng)建的。
由于這是我們第一次使用Utility Application,因此在這里做一些簡單的介紹,Utility Application會(huì)自動(dòng)幫我們創(chuàng)建2個(gè)view,第一個(gè)view叫做main view,第二個(gè)view叫做flipside view,在main view上面有一個(gè)information button
,點(diǎn)擊這個(gè)information button就會(huì)切換到flipside view。在flipside view的navigator bar上有一個(gè)Done按鈕,點(diǎn)擊這個(gè)Done按鈕,就會(huì)切換回main view。在Project navigator中選中MainStoryboard.storyboard,就會(huì)看見2這個(gè)view,而這2個(gè)view就分別對應(yīng)著BIDMainViewController和BIDFlipsideViewController。

好了,下面我們需要添加一個(gè)Settings Bundle,如果你的一個(gè)app需要在Settings中進(jìn)行設(shè)置,那么在你的項(xiàng)目中一定要加Settings Bundle,這個(gè)東西的作用就是當(dāng)你把你的app安裝到iphone上后,它會(huì)自動(dòng)在Settings中添加與這個(gè)項(xiàng)目相關(guān)的一個(gè)條目(cell)用于設(shè)置。
2)添加Settings Bundle
選擇File>New>File...,在左邊的選擇Resource,右邊選擇Settings Bundle,點(diǎn)擊Next按鈕

保留默認(rèn)的名字,點(diǎn)擊Create按鈕完成添加

展開Settings.bundle,有2個(gè)默認(rèn)項(xiàng),一個(gè)是en.lproj文件夾(這個(gè)暫時(shí)忽略,用戶本地化程序的,現(xiàn)在無需理會(huì)),另一個(gè)是Root.plist,從后綴名我們可以斷定,Settings中的項(xiàng)是基于Property list,也就是一個(gè)xml文件。
選中Property list,在editor pane中會(huì)顯示如下內(nèi)容

我們改變一下Root.list的顯示方式,在editor pane的任何地方點(diǎn)擊鼠標(biāo)右鍵,然后在彈出的菜單中選擇“Show Raw Keys/Values”

然后Root.plist會(huì)顯示如下樣子

最直觀的發(fā)現(xiàn)是2個(gè)Key的名字變了,“Preference Items”變成了“PreferenceSpecifiers”,“Strings Filename”變成了“StringsTable”,其實(shí)內(nèi)容并沒有改變,只是顯示的方式不同,這個(gè)看個(gè)人喜好吧,前者名字比較通俗移動(dòng),后者名字更貼近實(shí)現(xiàn)情況。
另外,我們不必過多關(guān)注StringsTable,這個(gè)值是用在localization的時(shí)候的,因此在這里你可以直接刪了它。
3)添加Settings中的控件
添加Text Field
接著我們展開PerferenceSpecifiers,里面有4個(gè)默認(rèn)的Item,這些都是系統(tǒng)幫我們生成的,但是這些并不是我們這個(gè)例子想要的,所以,我們刪除Item 1、Item 2、Item 3,只保留Item 0。

(上圖中我把StringsTable也刪了)
接著我們展開Item 0,看看里面有些什么的東西
里面有一個(gè)Title和Type鍵值對(也就是Dictionary),我們把注意力集中到Type,它的值是PSGroupSpecifier,說明這個(gè)item是一個(gè)group類型,在這個(gè)item之后的所有同級item,都是屬于這個(gè)group的,直到下一個(gè)group類型出現(xiàn)。在PreferenceSpecifiers下,必須要有至少一個(gè)group存在。Title用于設(shè)置這個(gè)group的名稱,這個(gè)屬性是可以省略的。
在觀察一下Item 0的顯示方式:Item 0 (Group - Group),括號(hào)中第一個(gè)Group是只這個(gè)item的類型為PSGroupSpecifier,第二個(gè)Group是這個(gè)item的Title值。我們修改一下Title的值,設(shè)置其為“General Info”

設(shè)置完成后,你會(huì)發(fā)現(xiàn)Item 0的顯示變成了:Item 0 (Group - General Info)
PSGroupSpecifier并不是一個(gè)實(shí)際可以操作的類型,它的作用僅僅是把幾個(gè)相關(guān)的屬性包含在一起,形成一個(gè)table view中的group,下面我們添加可操作的節(jié)點(diǎn)。
首先將Item 0合攏,然后鼠標(biāo)選中Item 0的整行,單擊鍵盤上的return鍵,一個(gè)新的Item(Item 1)出現(xiàn)在Item 0的下方,并有一個(gè)列表彈出,讓你選擇這個(gè)Item的類型

在這里我們選擇Text Field,創(chuàng)建完Item 1后,展開Item 1

可以看到一共有3個(gè)鍵值對,Type的類型為PSTextFieldSpecifier,另外2個(gè)分別是Title和Key,將Title賦值為“Username”,將Key賦值為“username”(注意大小寫)。這里的Key是用于保存和獲取Item 1的值的,每一個(gè)Item你可以理解為是一個(gè)Dictionary,一個(gè)Dictionary就是一個(gè)鍵值對,那么這個(gè)Key的作用就是獲取或者保存指定的值。(Item 0中并沒有Key,這個(gè)是因?yàn)镮tem 0的類型是PSGroupSpecifier,沒有需要保存的值)
在這篇文章剛剛開始的時(shí)候,我們提到過NSUserDefaultes,NSUserDefaultes就是使用這個(gè)key來獲得item的值的,也是用這個(gè)key來保存更新值的。
最后我們?yōu)镮tem 1再添加2個(gè)屬性,選中Item 1中最后一行(Key所在的行),然后按下鍵盤上的return,一個(gè)新的行出現(xiàn)在Key的下面,另外有一個(gè)list讓你選中Key的名字,這里我們選擇“AutocapitalizationType”,然后設(shè)置值為“None”。同樣的方法再添加一次,這次選擇“AutocorrectionType”,然后設(shè)置值為“No”


“AutocapitalizationType”的意思是是否自動(dòng)完成輸入,也就是說你輸入一個(gè)單詞的前幾個(gè)字,系統(tǒng)會(huì)出現(xiàn)一個(gè)列表,列表里面會(huì)有相關(guān)的詞匯,你只有直接選中,就可以完成輸入了,這里我們設(shè)置為“None”,無需自動(dòng)完成。
“AutocorrectionType”的意思是自動(dòng)糾正拼寫,就是系統(tǒng)幫你建成你輸入的單詞是否有拼寫錯(cuò)誤,我們同樣把這個(gè)功能關(guān)掉了。
好了,保存一下Root.plist。
到此為止,我們可以試著編譯運(yùn)行程序了,為了使程序能夠在Settings中突出顯示(好找一點(diǎn)),我們?yōu)槌绦蛱砑右粋€(gè)圖標(biāo),先下載一個(gè)圖標(biāo)icon,然后在Project navigator中選中根節(jié)點(diǎn)AppSettings,然后在左邊選擇TARGETS下的AppSettings,打開Summary tab,展開iPhone / iPod Deployment Info,找到App Icons

將icon拖入到左邊的圖標(biāo)中(右邊的是視網(wǎng)膜屏用的圖標(biāo),我們這里沒有提供這個(gè)圖標(biāo),所以就空著吧)

好了,編譯運(yùn)行一下程序,程序啟動(dòng)后,按Home鍵回到桌面,然后進(jìn)入Settings,在Settings主界面的最下面,可以找到我們創(chuàng)建的AppSettings程序圖標(biāo)

點(diǎn)擊該圖標(biāo),就會(huì)進(jìn)入這個(gè)程序的設(shè)置

上圖中我們可以看到在Root.plist中我們設(shè)置的項(xiàng)還原出來的結(jié)果,首先是一個(gè)Group,Group的Title為General Info,然后在Group中是一個(gè)TextField的項(xiàng),它的Title是Username。
OK,到此位置,你應(yīng)該對Settings有所了解,知道里面的項(xiàng)是怎么產(chǎn)生的,每個(gè)項(xiàng)的屬性的作用等等。下面我們接著添加更多的不同類型的項(xiàng),全面的對Settings進(jìn)行操作。
3)添加其他的項(xiàng)
添加Secure Text Field
先將Item 1閉合,然后選中它,按鍵盤上的command+C,command+V,復(fù)制粘貼一份Item,一個(gè)新的Item 2會(huì)出現(xiàn)在Item 1的下面

展開Item 2,并將其下的屬性設(shè)置為下面的樣子

如上圖所示,Item 2是用于接收密碼的,它的Type類型還是為PSTextFieldSpecifier,將它的Title設(shè)為Password,Key為password,這里多了一個(gè)新的屬性叫做IsSecure,當(dāng)將它的值設(shè)為YES時(shí),那么在文本框中內(nèi)容就會(huì)以密碼的方式顯示。(你可以編譯運(yùn)行一下,看看是不是這個(gè)密碼框的效果)
添加Multivalue Field
Multivalue Field會(huì)產(chǎn)生一個(gè)帶箭頭的cell,點(diǎn)擊該行后,會(huì)跳轉(zhuǎn)到下一個(gè)table view,下一個(gè)table view中會(huì)包含多個(gè)選項(xiàng),用戶在多個(gè)選項(xiàng)中選取其中的一個(gè),然后返回到前一個(gè)view,該cell中的內(nèi)容就是用戶選取的內(nèi)容。
我們合攏Item 2,然后選中Item 2,按return鍵新建Item 3,選擇Item 3的類型為Multi Value

展開Item 3,可以看到,Type的類型為PSMultiValueSpecifier。將Title設(shè)置為Protocol,Key設(shè)置為protocol。

ok,下面我們會(huì)添加一組Titles和Values,Titles保存每一個(gè)選項(xiàng)的顯示值,Values中保存每一個(gè)選項(xiàng)的id,他們是一一對應(yīng)的。保持Item 3展開的形態(tài),然后選中Item 3,按return鍵(在Item展開的形態(tài)下選中并按retuan鍵,是添加當(dāng)前項(xiàng)的子項(xiàng);在Item閉合的形態(tài)下選中幫按return鍵,是添加同級系項(xiàng)),會(huì)新建一個(gè)Item 3的子項(xiàng)并出現(xiàn)一個(gè)下拉框選中子項(xiàng)的類型,在這里我們選擇Titles。

重復(fù)上面的動(dòng)作,再創(chuàng)建一個(gè)Item 3的子項(xiàng),并選擇Values。

選中Titles,然后點(diǎn)擊加號(hào),添加一個(gè)子項(xiàng),賦值為HTTP

重復(fù)這個(gè)動(dòng)作,添加以下值SMTP,NNTP,IMAP,POP3

使用同樣的方法,為Values添加項(xiàng),添加完后的樣子如下

Values和Titles不同之處在于一個(gè)是小寫一個(gè)是大寫,當(dāng)然,如果你全部使用大寫或者小寫也是沒有問題的,看個(gè)人喜好了。
編譯運(yùn)行一個(gè)程序

在Passwrod中輸入密碼,顯示的是一個(gè)一個(gè)的小圓點(diǎn)。Protocol項(xiàng)的右邊多了一個(gè)箭頭,點(diǎn)擊該項(xiàng),跳轉(zhuǎn)到下一個(gè)view

這里就是我們剛才添加的Titles的內(nèi)容,我們隨意選中一個(gè)

選中SMTP后的狀態(tài),然后我們點(diǎn)擊左上角的AppSettings按鈕返回上一級view

剛才選中的SMTP就顯示在Protocol項(xiàng)的右邊。
添加Toggle Switch Settings
Toggle Switch很簡單,就是一個(gè)switch,可以選擇打開或者關(guān)閉,這個(gè)類型的目的是設(shè)置一個(gè)bool值。
合攏Item 3,然后選中,按return鍵,添加一個(gè)Item 4,并設(shè)置Item 4的類型為Toggle Switch,展開Item 4,設(shè)置Title為“Warp Drive”,Key為“warp”,將DefaultValue的值改為YES

好了,編譯運(yùn)行一下,一個(gè)Switch出現(xiàn)在Protocol的下面

添加Slider Setting
Slider我們已經(jīng)熟知,在Settings中,一個(gè)Slider可以在其2端各放置一副圖片(但我發(fā)現(xiàn)在iphone中放置圖片的例子不多),Slider本身沒有帶文字說明,我們也不可以在Settings中放置一個(gè)label告知用戶這個(gè)slider的作用是什么,因此這里的解決方案是添加一個(gè)新的Group,然后為Group添加文字說明,告知用戶slider的作用。
合攏Item 4,并選中,按return鍵,添加Item 5,選擇Item 5的類型為Group,并設(shè)置Title值為“Warp Factor”

合攏Item 5,并選中,按return鍵,添加Item 6,選擇Item 6的類型為Slider,根據(jù)下圖設(shè)置Item 6的屬性

編譯運(yùn)行一下程序,效果如下

剛才我們說了,Slider的兩端可以各添加一個(gè)圖片(圖片的大小為21 * 21 pixel),我們現(xiàn)在就來添加,先下載這里的圖片
為slider添加image的方法有些特殊,我們并不是直接將圖片拖到project navigator中,然后放到slider中,Settings并沒有為我們提供這樣的方法。我們使用別的方法添加,首先在Project navigator中鼠標(biāo)右擊Settings.bundle,選擇Show in Finder

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

然后將2張圖片復(fù)制進(jìn)包里面,然后在Project navigator中也能夠看見這2張圖片了

接著打開Root.plist,在Item 6中添加2項(xiàng)Max Value Image Filename和Min Value Image Filename,為Max賦值rabbit,為Min賦值turtle

再次編譯運(yùn)行,2張圖片出現(xiàn)在slider的左右2邊。

添加一個(gè)Child Settings View
這個(gè)意思就是單擊table view上的一個(gè)cell,跳轉(zhuǎn)到另一個(gè)Settings view。經(jīng)過上面的一些講解,我們實(shí)際上都是在對plist進(jìn)行操作,由此可以推斷出,所有的Settings都是以一個(gè)一個(gè)的plist文件,因此如果要跳轉(zhuǎn)到另一個(gè)Settings view,那必須包含另一個(gè)plist,根據(jù)這個(gè)思路,我們進(jìn)行下面的操作。
我們再創(chuàng)建一個(gè)Group,創(chuàng)建在Item 6的下面,并命名為Title

然后我們在Item 7的下面添加Item 8,按照之前的方式,現(xiàn)在我們應(yīng)該設(shè)置Item 8的類型了,但是在默認(rèn)的下拉框中并沒有我們需要的類型(Child Pane),不急,我們展開Item 8(在這里確保你選擇了Show Raw Keys/Values),然后點(diǎn)擊其Type行的Value列最后邊的按鈕,會(huì)出現(xiàn)一個(gè)下拉框

在下拉框中選擇PSChildPaneSpecifier,這樣Item 8的類型就是一個(gè)Child Pane了。
接著設(shè)置Title為“More Settings”,Key空著,因?yàn)檫@是一個(gè)起到導(dǎo)航作用的Item,我們無需得到它的值,也就不需要它的Key了。

再接著我們選中最后一行Key,按return鍵添加一個(gè),在下拉菜單中選擇File

我們需要關(guān)聯(lián)一個(gè)plist文件,這樣就可以導(dǎo)航到另一個(gè)Settings view了,下載這里的More.plist,還記得剛才我們是如何為slider添加2個(gè)圖片的嗎?在Project navigator中鼠標(biāo)右擊Settings.bundle,然后選擇Show in Finder,在Finder中鼠標(biāo)右擊Setting.bundle,選擇Show Package Contents,將More.plist復(fù)制進(jìn)去,這樣在Project navigator中就出現(xiàn)More.plist了。

由于More.plist是現(xiàn)成幫我們做好了,因?yàn)槲覀儾恍鑼ζ溥M(jìn)行任何操作,直接用就可以了。編譯運(yùn)行程序

Settings view的底部多了我們剛才添加的More Settings,點(diǎn)擊More Settings,跳轉(zhuǎn)到More.plist的Settings view

可以看到在More中前4個(gè)都是Text Field,最后一個(gè)是Mulitvalue Field,之后大家隨便點(diǎn)吧,反正也就這些東西了。
4)總結(jié)
到此為止,所有可以在Settings中添加的控件都已經(jīng)介紹了,總類不是很多,一共6種,而對于Settings的操作,也就是對一個(gè)plist文件的操作,iOS系統(tǒng)會(huì)自動(dòng)將plist中的內(nèi)容反應(yīng)到Settings上去,我們只需針對plist進(jìn)行操作,就可以很簡單的完成Settings view的設(shè)置。在下一篇中,我們將把Settings中的值和真正的app程序連接起來,在Settings中設(shè)置值后,在app中會(huì)反應(yīng)出來,在app中對一個(gè)值進(jìn)行更改,在Settings中的這個(gè)值同樣會(huì)被更新,連接這兩個(gè)東西的橋梁就是之前提到的NSUserDefaults,我們在下一篇中進(jìn)行詳細(xì)的介紹,謝謝!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時(shí)售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價(jià)比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。