亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

從零開始學ios開發(十九):ApplicationSettingsandUserDefaults(上)

2019-11-14 20:16:57
字體:
來源:轉載
供稿:網友

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 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品香蕉av| 亚洲加勒比久久88色综合| 26uuu另类亚洲欧美日本老年| 韩剧1988在线观看免费完整版| 久久视频免费在线播放| 91精品国产自产91精品| 亚洲成年人影院在线| 日本欧美国产在线| 亚洲国产精品久久久久| 欧美黑人性视频| 国产精品va在线| 日本精品在线视频| 一二美女精品欧洲| 亚洲综合中文字幕68页| 久久综合88中文色鬼| 日韩在线播放一区| 91精品国产综合久久香蕉| 欧美激情综合色综合啪啪五月| 精品网站999www| 欧美激情一区二区三区在线视频观看| www日韩中文字幕在线看| 日韩在线小视频| 国产精品激情av电影在线观看| 日韩av一区二区在线观看| 上原亚衣av一区二区三区| 国产精品99蜜臀久久不卡二区| 亚洲影视中文字幕| 一本大道久久加勒比香蕉| 欧美有码在线观看| 成人疯狂猛交xxx| 亚洲在线www| 欧美肥老妇视频| 亚洲欧洲在线免费| 美女av一区二区| 国产精品你懂得| 精品国产一区二区三区久久| 国产网站欧美日韩免费精品在线观看| 亚洲最大激情中文字幕| 亚洲国产精品资源| 久99九色视频在线观看| 欧美激情乱人伦| 成人春色激情网| 欧美一级视频在线观看| 成人www视频在线观看| 日韩欧美有码在线| 久久久久一本一区二区青青蜜月| 亚洲奶大毛多的老太婆| 国产精品ⅴa在线观看h| 久久久久99精品久久久久| 色午夜这里只有精品| 亚洲最大成人网色| 在线观看精品自拍私拍| 久久青草精品视频免费观看| 亚洲欧美制服综合另类| 最近2019好看的中文字幕免费| 国产精品美女在线观看| 中文字幕亚洲欧美日韩高清| 欧美视频精品一区| 亚洲永久在线观看| 国模精品一区二区三区色天香| 欧美孕妇毛茸茸xxxx| 欧美日韩免费网站| 久久成人亚洲精品| 色噜噜国产精品视频一区二区| 欧美成人手机在线| 国产精品久久久精品| 欧美野外wwwxxx| 欧美成人在线免费| 精品久久久国产精品999| 4k岛国日韩精品**专区| 色综合老司机第九色激情| 国内精品久久久久影院 日本资源| 久久久国产一区| 亚洲国产成人在线播放| 色综合久久久888| 欧美男插女视频| 精品久久久久久久久中文字幕| 91精品国产自产91精品| 国产亚洲激情在线| 久久精品成人一区二区三区| 国产精品中文字幕在线观看| 中日韩美女免费视频网站在线观看| 最近的2019中文字幕免费一页| 久久最新资源网| 日韩有码在线播放| 国产精品人人做人人爽| 亚洲国产精品成人精品| 国产精品一区电影| 欧美在线激情视频| 久久久久久噜噜噜久久久精品| 久久人人97超碰精品888| 亚洲 日韩 国产第一| 91国产美女在线观看| www.日韩不卡电影av| 欧美专区国产专区| 91av视频在线播放| 亚洲精品电影网| 亚洲人成亚洲人成在线观看| yw.139尤物在线精品视频| 在线视频欧美日韩精品| 亚洲男人av电影| 国产玖玖精品视频| 日韩精品中文字幕在线播放| 欧美高清电影在线看| 国产精品爱久久久久久久| 久久夜色精品亚洲噜噜国产mv| 欧美大片va欧美在线播放| 欧美激情2020午夜免费观看| 国产精品mp4| 欧美成人精品一区二区| 都市激情亚洲色图| 久久韩国免费视频| 久久亚洲精品中文字幕冲田杏梨| 欧洲日韩成人av| 亚洲国产精品久久久久秋霞蜜臀| 国模叶桐国产精品一区| 中文字幕亚洲一区在线观看| 国产精品99久久久久久人| 亚洲欧美日韩在线一区| 色婷婷久久av| 91tv亚洲精品香蕉国产一区7ujn| 精品久久中文字幕久久av| 亚洲精品视频网上网址在线观看| 亚洲影院色在线观看免费| 日本免费一区二区三区视频观看| 国产亚洲人成a一在线v站| 国产日韩在线一区| 亚洲丝袜av一区| 91精品成人久久| 国产精品99久久久久久www| 在线视频欧美日韩精品| 亚洲伊人一本大道中文字幕| 欧美精品一区二区三区国产精品| 日韩在线中文字| 最新国产精品亚洲| 亚洲最大福利视频| 国产suv精品一区二区三区88区| 一本色道久久综合亚洲精品小说| 久久久久久亚洲| 国产精品网站视频| 欧美性少妇18aaaa视频| 精品久久国产精品| 日韩精品亚洲精品| 国产精品麻豆va在线播放| 一区二区亚洲欧洲国产日韩| 欧美国产日韩一区二区| 日韩精品在线免费播放| 日韩精品免费在线视频观看| 伊人久久久久久久久久| 亚洲一区二区三区视频| 欧美网站在线观看| 国产日韩在线播放| 欧美有码在线观看| 日本精品久久中文字幕佐佐木| 少妇高潮 亚洲精品| 国产精品大陆在线观看| 国产精品露脸av在线| 久久精品视频va| 国产成人精品一区二区三区| 在线观看中文字幕亚洲| 日本精品中文字幕| 性欧美亚洲xxxx乳在线观看| 欧美视频一区二区三区…| 国产精品久久久久9999|