您好,登錄后才能下訂單哦!
在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,我們在下一篇中進行詳細的介紹,謝謝!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。