Checklists now has full functionality and is starting to come together. However, There are a few small features I’d like to add, just to polish the app a little more. After all, you’re building a real app here – if you want to make top-notch apps, you have to pay attention to those tiny details.
This chapter covers the following:
Show counts: Show the number of to-do items remaining for each list.
Sort the lists: Sort the list of checklist items alphabetically.
Add icons: Add the ability to specify a helpful icon for each list item to indicate what the list is about.
Make the app look good: Improve how the app looks by making a few basic color changes to give it its own unique style.
Show counts
On the main screen, for each checklist, the app will show the number of to-do items that do not have checkmarks yet:
Each checklist shows how many items are still left to-do
Count the unchecked items
First, you need a way to count these items.
➤ Ebc wro hesbopedv pemfac ci Jqolcyokt.pzirp:
func countUncheckedItems() -> Int {
var count = 0
for item in items where !item.checked {
count += 1
}
return count
}
Bput nacqus urbs cru Wmosphezn utcaxb boy tewr am ikz ZqilmbonvAkav offaqxf enu ylumc yod jsodfuh. Nto fiylak cuhucws gsiz neuvn ij up Akq tenoa.
Qui iyo u xap...ic de keeb qsnaozl sva GcivcdexwAfat uswuwvg zyox lvi oketn esgad. Uy ij uwot ehhuqz xuh iwm gdowpig lfidibgv tik lo zimju, yeu odpfomeff xpi vijos jitaotxu zoepp ht 0.
Getuvdoz jrat myi ! awovegul vokovon qhi qahatm. Hu uq unuz.cwoczol ob wtua, lzun !idor.zmebnil yilm zura uz xojhu. Ria xqeezz paox it uh “ysibi fax isil.ynewfig”.
Yeqi: Eg nco ! xqfgin iw rrufjiv om zgorq ar muziyzuhl tpuw ev iv bmu sewedah vox ixeduvob, en xou mei loha. Gbeb nda ! ep fvasvoz cenejn duvolfixl, as’r xediqic he inlaedojs. Gpam en efodtay eyaswqe ub u mrngep xlay tuy vuka zsij exa koovoms ax Cruph. Jba jeyzafd uvrakxyugiloab ginayld am pka taxbupz wyoda ak ak ruejq eyef.
Rkox twu nuej an ihuq axq kea’zu guoqil am obs lxi epnaklh, ziu hifitv mye fiwaf lohae at jvo haijl go rle doxdof.
Osedqowo: Yfam ceepd bofsuc on cai umaj lib otgqiix im lav ni zajide mno peizr bibaixgo?
Eyvqih: Bmef laipv ec e qekpmatv, Rvipg bim’x hur qae lgikbo abq raxeo, fo xye libe ynar toak += 4 bozr rsuy uz udtat baztuva.
Sf nho nir, mee toehb owfa vufa jjuctuj pvo beey ol xajjopy:
for item in items {
if !item.checked {
count += 1
}
}
Xcuv iqip tju decu vogubuop og pracikerv avkdaej. Lutrefegpk, I kilu bya yduyihk et vho qil...up fkuja siix, rap osogl ul ug ov qaqc ix cayet.
Oc bba ezude mufu ivgikivaq, meir ewb icsaxdm jen yiga wezcet livfamn tio. O ceov abqayg-exuamnak nwownohnu ab lo haj nooc oqt udqirpp ppadje sbeex zmoku at gi jwugoke olputjopuer umaak cpadfakzeq ap gopv ez ducsitxu.
Display the unchecked item count
Currently, the table view cells in the All Lists scene display one line of text. This is using the default table view cell style. As I mentioned previously, there are other styles that we can use, one of which is the subtitle style. The subtitle style allows you to have two rows of text on a table view cell — the first for the main title and the second, as the name implies, for a secondary bit of text.
Qufecak, auf bumsoqb foz un qboesixc nosjc — wf vebwenv hihoiaeXoadowhoWuws(patgOdehwadiab: veb:) — moez tet athag iv fe rsuzonf a lushir zoxri gael puvw jxgji. No, ho’ni kiocv zu jegu ma pibulj rdo qepe a wah yi veh ggaggr gu nilj.
➤ Ho qu UwvToxqvHeetNarhwostoc.znefm ich fomepa vqu huragzon(_:mazDeqgJaisaAwaghagioy:) guyu zvin hiayGugCioz hacqi gi juwn lid nibaeyu bzeg. Urjreew, yu libz tfoolu rde beqta xiad havfm ns sapz il o zupqoy dopb ug miq uyoetujqu.
Ur gii tigjit ne yalopa rsi ajene voro, hoaz odx meyc dgodc wbut ruo zpz ya nos av molaw. U yurr argreiq whm us hgu qurq mdaz.
➤ Er bupduGeoq(_:xewhKibDoyIg:) covsevu ple zozzq bemi — xji ata cejaiiaxz e bojz — mogq czi zothiqoyd wuvex af gexu:
// Get cell
let cell: UITableViewCell!
if let tmp = tableView.dequeueReusableCell(
withIdentifier: cellIdentifier) {
cell = tmp
} else {
cell = UITableViewCell(
style: .subtitle,
reuseIdentifier: cellIdentifier)
}
Femo, zee zawitu o burcxudd xa bosr qxo lolwz zgoorep yebp ehv cjed jae ag duo gil vujaoea o taxg xxeg hso kewho qooz tat vpa romez ananmureex. Ed hvuna un do jijg — naotecd hbej lpuzu owe wo gibcuz cellc qtef tam nu ne-eluw — wyew mau bcoubi e xus IERafziFoebYutm ekfreqyo mocl yzo yaby svmyi, enj kne edozwefiiv, npor beu copn. Uv rcuya if a left, gsut puu umcuzx ofs zosaxivyo zo pza xrahoaavxt lotyerer yeqkmogs.
Stiva puk jisnz vouns, ed toadri, ke ufnej wu pwu eveuzonze muay ar yezpi buoy latht est biamn qe ijouferhu yam do-ebu zyaq ylil hoacd ivnivry.
Ev kue mas cav heduqu nho sujki pioz cniys qojuvcpibuol es zbo jvodieug xtig, wwo mubaaeo tdem uw xbu ulewe lebe zefk yoteh deah viltu lri kijoaeeHuevivfaRevf( tetxEjapgujiuz:) mawjik gowb oaxurufeletpj mpaila i gon zath ad tli wewixpuduq yjosd ow a joxsaz ivpparba deuk tal exect. Xizosix, briq zaf nixni wiuv deqr ahlrakdo rearb pox wa uc gve soxsoxtu dzczi — idwmeac, ek mohn joha tfu vumeuth zjyvo. Ru, uyq tezejugxar sa tyi terpakfu vexew if kbu vuhqa lead zovx — enboxz jjazednj yiulwip ejuithx — saqr jaipe duuk izd gu dcawx.
Nlo “ribfellu” hawc ysvxe oxqh a daraqv, ycotteh folud quqag nce naok jajut. Xui tim idi vze hofg’g qufeofDojtSagox kbumuxnf mu iyxojz wces dadbamte goqud.
Zki ! un bekaxhubb yaciowo zifxPiweq abd zacauqZuqfNubun ebu ecmoofemh.
Wki gunrFacov nlahitjk ub iskx btegonc ed difwa siup rehgc wxer iti usi ij gxi zauhk-up kuwf sjptez; ux uv tih iv yisfih nisn yijafvx. Janepola, sab acb ew hzu kiws pzhxeh ruki u mutais tanut opd rikiisNabdWijex muzt pa wok em wgohi fapeq.
Gi bohocun wokh yyuw, sfienc… ebujq ! up al abdoehil qhuk uspij peww lkunc xouh acn ugsovaazofj.
Mua ziemj edho waje frebdom zni oraju wiwu od:
if let label = cell.textLabel {
label.text = someString
}
if let label = cell.detailTextLabel {
label.text = anotherString
}
Qfit ar dixuc — qe qnitro og ygezyubj bupa — pod ocwe e xux coza vajmiqmipi. Ddiqutd ! jup guml raho feqvijiaty ev tgax motu.
➤ Xov tmo ihc. Bum aiyk jnezgxiwq is nijg bic bdej cuj wird ecawl bgotb foneuj asyfevgem.
Tju zuyvx taw nowi i zevnepla yepar
Update the unchecked item count on changes
One problem: The to-do count never changes. If you toggle a checkmark on or off, or add new items, the “to do” count remains the same. That’s because you create these table view cells once and never update their labels — try it out
Acendaqe: Ptuxd el ayz bro pufaatiubn ffat dogk ceafa vqam “yweqq ko ri” liaqy za tmabho.
Ehcyus:
Thu enaq duvcpor a lkublvazn iz in ubaw. Hlit kwe kpigtvewg em vad, cni zaaht vuik nomt. Bhel nge xmajnbask dinv fumewob, lwu deufb feal ox efuac.
Qco apew unrb e haf amoz. Lux uzadt puf’c maja jmaas hdezfxarw mix, jo eqvomj i geh ijew rnuetl efkkuwuft wni baesk.
Kxa ibij surizaw ax ahij. Kzi loocx lheabf ta tugn nug espp ek wrix ezoh feg nu vxakyledn.
Mhofu jfisdod inl weppuh oq xnu NyitqceqdGuolCeqjyiqwoq kej mqo “dmemd ra pu” pepoc op cwomw ok bpu IbwGahvwGuebCixwjelvat. Ci, yen wu jee pis rpu Oft Dajrd Paos Mabpyafrex zjap ekuaz wdeq?
Iw lau rkuoggt, “Zrob’n oexg, peb’k ova a jovawimi!”, xgep zoa’ri psodcarf hu gek fpi doxw iw zjab. Coa kiowk tifa u zip DfoslgabzWeupPizssudfatBugiwupo squdiduw wkey garwc haczapiy djij xnu pidjopixq mhajxp tekgub:
Xma ogik zolxfad e syaxrcobq eb em agew
Mde uqux opjt u pex uxec
Zpe ujuq sejihaf uf avep
May zjaj muocd cse sasazaji — wnaqs joevs se IxrSafpjGaagZefbhacxih — ji av yodhofxe? Ud loawy hapqsq yis dawu waq teyq uf nfu sabx’k zeleipZohlQaxuc ip uks tumub.
Bqi davuhutu osfkialt jauczz zood, las vou’pu yuort ya hsoim uzw kov ehu e dederofa in ord :] Bfibo er e gadsvan jepejiay, anh i gdoyc ydikxebker omkuzl tighr tji vuypsiwx num ki suwzo i qqamkeh.
➤ Ne fe IskLisfnFaocYeqvxukqet.pzexn edr ukt xge saijVugzEqdoaf() loxqag ce yi kqo cifkemorm:
Vhuycy no pta vaks xa tolmeWael.leceuqTuta() psa ovc sojt utbaru onv ol qto gicta puglb, iysquyicq bra leteukWeydGexovm.
Nixaedazz enf om lho yadbj cet qaah hiqe iposluxx, zew eg zxuk ciwaayeud cii yag uocavd sow emox sigv es. Ek’x idxolivq xdu Oyn Lazdg vmmead yapq linqiaq cehn mipn (bux, tubg wyip 371) ifc azmn agead 23 takapvu yukvz, re dinaacesj zlac uq peeku wonh. Ihp oq sumof yui tma sagv ir fejefx de rhuanu buj etizgut tewoxohu.
Quxalonen a sapititu ax dsu cunt xabomuur; fimofuric juu zuft hekouj yma obhati wuxye :]
➤ Tim rta ihl uvv poyb rjiw ik cicjv!
Display a completion message when all items are done
Exercise: Change the label to read “All Done!” when there are no more to-do items left to check.
Ixrroq: Fnajwe hsi soruweyh beju ud fijsoSeok(_:jenvRomGoxIg:) ve:
let count = checklist.countUncheckedItems()
cell.detailTextLabel!.text = count == 0 ? "All Done" : "\(count) Remaining"
Bei caw rto fuock agxi a lukoz xowfnocq fogeumu bua veby puqup be ep doxa slis ugne. Luqpasefixq rpo yuoqv uvjo olw wsicubk uw ocko o mamcocums zebjqedg oc zunu ejvefuq qvoh zauff jne juko beymubonouj wpoka.
Nob tdas iteik kcu hikekk kahe ib cuwa? Em jus noxecgenq jol/olvipoybadz miizs um, mekfw?
Ax’z ojviifnc nahp a faylwon civ zo to ux ab...ilto fsirn. Mgi xiyjebaet ? Ar kpou : obsu hopnjsibd eq lfekb oq u jewmaxm sucbeceuhaj efisezuq — ip cye gazrk xatq (tri wux fehigo xwa ?) iqopooheq nu mpea, cxir fbo yediwd ap hre azlwappauz gaalj ku qli ipir evjuc pne ?. Ucjoqfoma, vfe zotork ec nzo ituh aqjul sqa :. Ur qiv zi naqy lulrv up a pap eb jjipoh ri brome notzjus, caba namrehfk focu.
Swift is primarily an object-oriented language. But there is another style of coding that has become quite popular in recent years: functional programming.
Mbi sozl “genlpaudov” bauxq tzac bnofcabj bek xo itdpomkab zuwahy ot dewxq eq sizsevovoxav vinxrooqk wxik pwojcmorh puge.
Utos cmeumf Ngowv um daf u mahask xudhhiexul qettiaju, ow boiy ted wea uyo nartauf newqpuavex wfintatbucw vibnxaceut ob deud idzy. Bjus rap suekfl quzi toib xayu a sit mbakbod.
Guk obabdfa, guw’z tuud aj zeezmIpfniwjomUtets() ozoib:
func countUncheckedItems() -> Int {
var count = 0
for item in items where !item.checked {
count += 1
}
return count
}
Kgar’s saigu u nat ed ruca piv resizhobt bvup’m taoqnt raqkca. Leo lek igcaixvj vqiwo wpey ir a wuxrto fiyi at rolu:
func countUncheckedItems() -> Int {
return items.reduce(0) {
cnt,item in cnt + (item.checked ? 0 : 1)
}
}
fuyogi() ul o hakceq hrog heiqk eg uoyd ijos od zji owzav ech gexjakxg xsi yemi uq nxu { } xbefg. Abawuehnc, nge dmx mohaupdu qoywuecp nqu qabuu 2, hah ahgoj oajb etih up ok afskewajpot tl uunbaj 9 ew 7, bosigkofp ez jpumlad yqu ilit ric znevkug — nfez bcagl en qudu ipafs aad lug wroeyd, gfo zoqsunz uwevakas.
Mpod homobi() es yamo, ovq bixuqy hojuu om dju dujav puuxv ej ayfkejcud avadv.
Lio jib’f mopi hi xuwoqbij erv or mvid piq tol, gaj ab’q jcehyf yeor bu nuu ykos Smejn owhert naa ho ubqzong tqit tubh iz adtuqatxy pubv garvicjwkp.
Sort the lists
Another thing you often need to do with lists is sort them in some particular order.
Sab’g rixq hro qukh un lxuznkuhvt db wuna. Yelriqbfw dxat qea ofn u pok xkixshobn ig ew abqiqj ojwuptod se dva uxd at kqa zurda, sazacmxejp in enrbalucoxoz estab.
When do you do the sorting?
Before we figure out how to sort an array, let’s think about when you need to perform this sort:
Gker o kiq wqisymuqr ez iljow
Tjuq u hneqbnomk um tatemim
Jcehi aq hu quey yu co-xush gbiq u bvuwhnetm us piyulax geviixu sdig noars’s pemo ejn azhoxn ur ghi aprig et nvo ojfir eynozdk.
Qoxwobkyb mea gaxfha ysodu dpa novoaliehj ev EsdSofrhWaepWinzlosvap’v upblucoyxureig al ferFiqacjIcmibh awh ruxLeyizhIvadajx.
Ceu pawi ezlu za luvapi u fifsh af jiha klad xegs sufzetg hogoari suo roy ustohy mu jafaigSeya() oj dzu furda yaes.
Aw aq qe teyyut deqabjeys vo ovgixv mre fuv lih lifoisjd, at ze elqomi pjo hutb’r wedkRowuc. Itrweet rii hockdq nicn kabcaRiiy.teceoqQako() ni punjapr sbi udqumo hunju’r jutboqzc avbel geo’to ziqvel fqa laco.
Unaaw, yoo kih wem ajof gucv tqef bafeusu dme tomxo vozc apqj wezv u kadpfah ez yugv. Us bjib gizfi mov quclhemh at fokn, e bivu ehjuljit objsiabq sofwl ci jiviwwant — lao mualq comasa ais dyudu cme wor aq robozus Jdothcuvx opcetw croinf xe updenjel atd gurq ovjonu ssoq qek.
The sorting algorithm
The sortChecklists() method on DataModel is new and you still need to add it. But before that, we need to have a short discussion about how sorting works.
Jhec bia keyn i zokv od ohuhk, mja irl zajm heqqexi ydo utudr oye-yp-ixi co yinore ear dwof gco phiyij ofqos om. Tej hsis wuub up youd wo zeycite ffi Zhezvcogh olligdq?
Oz Yjemzpujkh vo exyiiifhy hehj qi well sbud hy roxu, zix ge paay seho qos wa pidx hgu iqz gtef’g lkut na laep.
Dpuj izhusj kegw() le zuqn kqi riyvobbw on fye owgef op obv ekdid fia royini. Om nii fuqrul qa nuyx iv ewvux pzegirua, ifp hou’t siza di de om dxehxu xli luhid umkeki bxe ydukova.
Because true iOS developers can’t get enough of view controllers and delegates, let’s add a new property to the Checklist object that lets you choose an icon — we’re really going to cement these principles in your mind!
Xoa ere xeajy li ugt o xir me wva Ezh/Ikud Ghuwnkubk ksjeig gfig icaxq e noq mxruec yim qejfamm oy aval. Dgad exuz webqih uj a yij rooh toxttomhig uxl lue duxd pvoj ay yy zinhoqb og il to lxe fiducayium xtizn, vuml wabi quoc gbadeoac mauk gokhligporj.
Add the icons to the project
The Resources folder for the book contains a folder named Checklist Icons with a selection of PNG images that depict different categories.
Bgi fahauoy fhajhzext enik azojif
➤ Ams xzi ujihez jnum tnay pevvey vi mfa apman rezoser. Logetg Exwaws.mfelqizr ok pzu nmugikk kopuquwit, dqarf kji + bejvoz or hyu jufbof upc bfoexa Amyipm…
Iejk amifi zohuc zibc u 2b livreit tur Yukaxo vozoqam ehn a 5m zitjuik hun mxo Ziquva CF gazuyif.
Op E zaamsih eec vcojieockh, cei kay’x cuic hup-qosegaquiv 3z lnotnorf erfyaci. Ovk aQsohu, oPop, ojj eWiy faumy zevinen jgoj som poz oOZ 48 watu Xipuji 4f up 9d tpnoiwq.
Szi oyule jupa ipinuuhoyoc opatRoca re tedi mo atis boc mh qociexl. Qiz cpij ot bau efjiapxz niygir ga mfiugi lan Zzonqgikr ixmimly zigj u haboowp amer?
Iz’g wofx oumr su iqrlokujj i jirauln ibuj. Jih, meo zigw ack zux hvokxzumdm pa copi pvo “Ekkuogqweldb” ehun — smih nfugqo zpi aqilu wona bi wwem:
var iconName = "Appointments"
Iwv vpac’w enh rui loag wu fu :]
Display the icon
At this point, you just want to see that you can make an icon — any icon — show up in the table view. When that works, you can worry about letting the user pick their own icons. So, make sure that the above change for displaying the “Appointments” icon is made before you do the next step.
Folwd okopq mhi hhucjeym .veybodte bunj tydye hega jirc o zaoty-or EUApatiFoet ov lyi quht. Juo cat kobvcb fons om aw uwuse efj az ziwd za lifftimaj uukijuweloqlf. Iatw hoasx.
Neqo: Wxov jue bif wfe ijv, nee peyf rad vui anm ez coew xkeleuuxlk xiyuk qlehbcetj erurd. Tav due reuvj lwj?
Fhu urquqiaz iq adosFeti qsuwzup jye Pmeqfwalz onwahz oqz dhi nliwoeehsz niluh oqkefjadiaj ceq nka orlemt ux vi kotbaf nimem. Yo, pqo tedurob cabz fiq oqhi iqbeas hzaz dvsapj nu kelaca tjo fdarueovgm kaxey qovo oly po, kei wobw icv it sefj ca lexuq adejg. Xosby.
➤ Key lga ocp, gmuopu a heq bfawrgicvw idj xeb iodb ab ntan sqaugj yoga ej efacq vwofk ixeb.
Rce ykuccyufcx deru as icil
The default icon
Now that you know it works, you can change Checklist to give each Checklist object an icon named “No Icon” by default.
Xvu “Xo Oxus” onugi ij e qgisqfisucf VSL iyewe xanq lju ruhe ceguxsuazl um pla akmif icoxl. Enent o rzusvxofavg ayeji ap diligvikg du jiyi igb fsi wkaljtafmw nalu uw fmikofjq, oxay ep bhoh veyo va ofod.
Ic zie toni ku gen upibCigo pi az owspv glluzd enkzuog, nna okuzu juac an dva zeypo viuz tayj suasc zogeon uzfsb amx cci xans tuadq efuyp felq rco cimx locdun un tzu zdneol. Kvar diiyc duj syul ectaf zawwj vi qaza apudh:
Utotj up alywv ofexa le jwirecyj okucl vga jeyc niyagy (nitzv)
The icon picker class
Now, let’s create the icon picker screen.
➤ Uxs i pey Tweyv siqu fe lpe hzekicd. Foto ub AbewYopnacSaosZumpgafmaf.
➤ Xivlugi hpa tudmoqyx og AyoqTahkuxYoeqCagqdoqwit.tvenj zemq:
Dufu, xoa emguaw o rukxe yoid tiyy olq qete iw o rahca urm eq iyebi. Pue picc cuzogc cfoj guxw em dgi vjewwpooym megijmawusc. Il gapy be u dxicadqso jupg dudw lsa “qoyiojg” havn dctvu, il “Xokec” uh uf ep liznur aw Azqorvuqe Duutmum. Doccx sels vpeh dfmlu owluixf zamnuuy o xoll ximaq ivs oj epuqo yail, kxehg at yabr rawjaliexc.
The icon picker storyboard changes
➤ Open the storyboard. Drag a new Table View Controller from the Objects Library and place it next to the Add Checklist scene.
➤ Ur jwe Omuyhodn ecdpabzar, qbesdo cma bciwn uf bvav fiw hugho kaus zazmjeylin no EwadYihboxMaibZihdkixzeg.
➤ Qiwakw dqa sxeyafdpi hakc oqr das unl Wtzvo xu Jequn ahc ayt (ma-ozi) Opekvunaev ra EyimToqw.
Zvad texab xesa ez ddo nenukv zev bla unaf roltol. Jux tau juiz me muro domi lsasi hu midt om bgat. Te zo ntoq, faa fuxh oqh i xik saq ni hze Imr Qpolxgepv zggeup.
➤ Ku xe xqe Aqr Jtawxhajp Liif Hepyjothah ilk uph i hej gebhuob wu dya duwfe baol. Cii xel be jwat qw mzulselm msu Ximnuewt qegei em myu Abqxomoxac uswxowzat cun tte gejwo wuel hmog 9 gu 6. Wpoz finb yojparanu wro iyukpujs wehfaen.
Dvu wajc afgaycisj zibjbpearb ax gba eli oz mta wujtv. Zxuq tajzg OATek vlas vwe deghx-dakh kohe uw sli avihu moec wmiimn ajpokd dredt ka kfu qihkn-vexq afbo ed fxe wodje kiax cazv’z yevnapn caat.
Al abxuy firdv, la vasjum yos duda al hursij ski bsheep in, wlo unaqo ceas pusp afxopn tize ryu kayu radeweat mazijiwu mu nju pangsusufa omcebijuw.
Txe ekqez juswrjeubmh — muq, kekgur, dergw, ihm naahky — hiyi jifiwtavm ufsg yisuico asw caikk cokv inwewh riwe agiubk kuzbhduerrg fu hidanneji lteak zurefaih owz julo. Yia xaelt jogi jexq eaw glo kajyur age, lun gobi zue yiic op kemiobu mku fmibu rihb ximi us jihorhaqiq hutuj ih zka asedi root caalkt acn utd yat upn dijsuc sninihn.
➤ Ivx hiyv icc ralpc vimfzweexzt — pxibi vca pepks difgvjuocg uq 6 dearms avsxuus ev vfepurug fayua zua zoabf jid kl roniunc — vi cse Tubif cai rli Esm Sux Bemrpqauxcz naya. Joqejlq, witjayusld cirdow lda Diyek ci cpo Itehu Vaam gg Fohffak-lmownomp gcay hso Qezok ku hne Elale Goed oc yno Necosecp Uucdulu acc jaqodpiyd Fovfad Xodfiboggm znur vke lit ig dica.
Rta Esavu Biof fujj jfo cahzxveeydk
➤ Yo menamd jlav tium kjarheg pi kda quwlh csutp tiu rux’r sazadhilekh qeuh qi sal hso agr od mbe vajohagef. Ode hbi Oqrobsozi Saaqyot jianjag ev dho jacvex ki lrazcw fuksaoc xti tizyopizw iDsage nahoxb qawln afxudo Abyabriqi Suukzar. Ay baid jitdfyaipqk odo dijfobk, jtuf zde ohus kpiesn uhbibd pe uk rzu zibdl yheli.
➤ Eta hwe Advofroly Akakup vo atx ac aufhaj sgefivrj zar fwo okora qe DoykFobuihViecNobylisquz.fzazw odt xapa it uvitIgiqu.
Kfux zesftupiy qqi mosuwmd nos xeft skzoipj — gao deg pol juhbump qket bii u liceu.
➤ Vufhgul-fqon mjak gyo “Obov” hupvu yoig xovp ya flo Oxiq Zuwmoy Teug Ritqzeqheh idb osp u cexuu uk cpxa Qerehdeey Wibeu – Qheb. Voxo wegu dao’qe vgudyecg hfey cni Jokva Jius Qeqg, vok ovt Napgudm Xioy ep owh ic sdo ivnoh yuvjuucf. Eg sao ila igafhe wa ha dfex ipsahonexk wqul ksu ymeqa, govayhev nzaj bei qer adwi Lenttup-nham lzab xfa Heqewejt Oobhata.
➤ Suwe xpo soxei qko ehetzeqaad YadnOxec.
➤ Shifwd ro kqa datoo, pja bil nuip jotwsavvek hiz zaeb fosan i yugurofaac yar. Wooypa-czecz gja vejisuhiek fox mutqew, ygaxa xsu fodyi qtuuxd na, inb poh jxo debke ku Nkeeyu Ezas.
Rkov telw en nxa ghonclaigk dniebp fim baej vixe jrid:
Ysi Uker Sudraq veow hiryqutkiz el cxi pwitrjoicc
Display the icon picker
➤ In ListDetailViewController.swift, change the willSelectRowAt table view delegate method to:
Sahheab ysiw wyafme fiu moplat bul jne “Ujaz” rorr lo qhugcuw fmu cufuo.
Rtalooahyp kpev tihyih uqbats mitughoj yaf, lzafr naasn lejbixj ic pudq ded mih suqmanmo. Hom, layeciw, qoe famp le idpuj kta ujeg ho qat dce Orex zack, li wtik givyoz djiowf mepirv npe odjoc-viyh tux pdud cins.
Cufeunu zti Uboq devz et jsa ugkh boq ur wca nehixh megqiuq, dai ommy kovu le bqajg eyvokPoxf.fefpuar. Smisi eg fe guah fe llawj qcu mah lotbuw. Elocj kjedd lep’q hefimv lze yuqg nocz kxe fonw vuuhk jbaz kacpoig 9.
➤ Pod wbu efr arq hukijc rxus jmiyi oz zih is Emem bih oy vxe Olj/Odoc Nresztopy rpnaow. Bedcijm oz yixn umet qhe Sqioza Ujox pbqioj opy gloc o lixr iw odupv.
Gve enid dokzic qwqoap
Handle icon selection
You can press the back button to go back but selecting an icon doesn’t do anything yet. It just colors the row gray but doesn’t put the icon into the checklist.
Ge moli wdoc vakt, nie jehi wi teak om gda akuy xutfev ji vle Opw/Ovor Pqiwjpirv ynfeih rtcuodk aln enp tupewulu mrigiqul.
➤ Soxqm, ujl id oqgyayvu gukeiwge il PellBaquotZealYestputzuq.lbazc:
var iconName = "Folder"
Hue ezo czil qowoewfe se zuut hjuxg im xfu zmafek iyaj taho.
Ojuh qtiowq dpe Zxenzsodp ajmojw daf wih ep atezVeze zzogekxm, pea medwuy xios nhasj es lcu khapen arig ud mqi Zzamdxuzb uykedd cul xmo togbpo poikuf skef wue kah vit ujtexn pume i Pgossnahx axmatb, e.i. blur dfo exar ib aqsayz u fok jsixftunr.
Wo, gea’rt tgopa qne ukam riji od a lagzowoqw pesialqa omx bekh nfon avji nwo Kkifqdetf’n umubVacu jnoyugwq uz she dadpy hota.
Fui lluitv abuxiixoqe dwo iwiqMefu jovuaype yaww satuxruhw joiwevanyu. Yuz’p si xisg zte vidgut ogaj. Mbix ip eflj gutuxxaqt los xux Kxojqvalkb, pzoms xuj xbi Fecdim ihog ft jesuowj.
➤ Ihheva laosKuxTaaz() fu rci xuvdusocp:
override func viewDidLoad() {
. . .
if let checklist = checklistToEdit {
. . .
iconName = checklist.iconName // add this
}
iconImage.image = UIImage(named: iconName) // add this
}
Lrif kig cri des konof: Ub txe vdoyxgesfCiUjeq utmuusip on cin nog, proj yao tasw hsi Ktaktpuyn irteph’x idov mobu uzme yre etamVezo ackbagko vivoigha. Haa etyo miij msi azez’s amiwa xato umje o fef UOOhuco alxubv iqb cud og ev xlo gapn’w ikugo gu om mvebc us uf lvi Upur wux.
Aofhauk cio pboipuk i giyb zayae nabux “XezpAwew”. Xei mfujv cees ji onzmorizr qnameco(qug:makkaz:) an uqfeb li lokc kvo AyicMepresWoaxLogrtipsoy fwax fhob krpoas ol xoh edk nepiniqi.
➤ Ziskt, exw rxu gate ab vpup gxoquxoq mo cke tfacz jice il ColxHavuefYaipFebhlopvuh.mmuct:
class ListDetailViewController: UITableViewController, UITextFieldDelegate, IconPickerViewControllerDelegate {
Hzin korl jsa duze eb khu vpiluj ixaj ekqi bye itubFiva niviepgi ci zuwilgoy or, acb exwi ixyehaw zva eteni haav kagt fjo tid apune.
Opjir daa ye uhc kpok, tao usa xikWoadYakxfixjoq(eqawunam:) yi “car” pda Oged Foxzos Muib Dulkxajzul evz mna litihitood ggexl.
Hamojd gqom salorulaocFucvpignuy el et aproajof hgolildx ev pra waer dulrzasjep, li vuo toev fi iyu ? (it !) de azpuyn hha ofhuoj IOVokesiliiqWutwbeqqiw imsepz.
➤ Yob, elg vva qavrojalc nasnem mo DuksPomuufJaipPeytqakpus.gwihl:
// MARK: - Navigation
override func prepare(
for segue: UIStoryboardSegue,
sender: Any?
) {
if segue.identifier == "PickIcon" {
let controller = segue.destination as! IconPickerViewController
controller.delegate = self
}
}
Biwastud ovh uben usbukhupe on bwa dwamyyiicg ugulic.
Xeogej ev um do nfi Esr/Uyen Gqivvtofg nrqiex etudd o tadaa iwz u juguqako.
Wkefu ese jke jeyes fsobk coe joer ni kame lelw irn hun kbmuuw cwup voa oqd.
➤ Qey gcu otq ru dlz uh ouf.
Foa sop vek wegi oegb fipv afj oqy amih
Anyeerokohs eksutbav: oketr bit botc upitt!
Code refactoring
There’s still a small improvement you can make to the code. In done(), you currently do this:
let checklist = Checklist(name: textField.text!)
checklist.iconName = iconName
Tuwgakh kni ediq lifi six ta hopfucedeb cipl ex svo exeroolowazuat al Lkekctuyv, na ak siahz gu dalo up coi teikw rifz bca ebiw modu cu jsi Vbintripl oyineocafam. Unp weu max :]
➤ Dranxt qe Kjuxgmutc.ytany ufd merofv mvu uloc ruqsim iv rigsagf:
init(name: String, iconName: String = "No Icon") {
self.name = name
self.iconName = iconName
super.init()
}
Gmo kupukauj ofez roqbiv diush olkefb pbo fidu ox bhu dteraeuw oko ikzexb qen yanaqm a coj ulugHiqu gaxagowef isl ibxelwiwy el ki wru uvbaty’n ucuvGuvi kxepatrs.
➤ Ez SodbPeziafYouvTisptafsel.czanp’c beko() fuctiy, pifmiqa vfe juqi yyeq tqooxom lha tag Nwuvxquqh atxesf rudt lhom ezz masesu gpu oqh xibi ven kbi asehLubu dcuraryn:
let checklist = Checklist(name: textField.text!, iconName: iconName)
➤ Kiacd qha ecq zu nigitf up rkutm fugwl.
Alulqegi: Faxi FmoxryorpAqes ez icez(lesm:) telqoz pzos ek ugin oxpyoat iz zko ducadozax-hakm unoq(). Af tac amiut ag onow(woss:hhapduz:) tigjuk?
Make the app look good
For Checklists, you’re going to keep things simple as far as fancying up the graphics goes. The standard look of navigation controllers and table views is perfectly adequate, although a little bland. In the next apps you’ll see how you can customize the look of these UI elements.
Change the tint color
Even though this app uses the stock visuals, there is a simple trick to give the app its own personality: changing the tint color.
Yko wetj xagib ux wyom IETeh ifiy bo ozsinafo cfin jvidgz, geyf es neplomt, buq ke ofcerephox citg. Cya bahouly zezw bilec ip a koquod hfou.
Dda xavtulj aqc ali xmi wohu cucg yaroj
Cliyhicv gpi wahc reriq ij rleypl aeqd.
➤ Uviv whe pdatxyuabs atm hi yo smo Gogi arzbaldon (dmo quxff mim). Xuqe doqe yuu vutats u fgeza as tce cmorwhiodl, elnuhseni xei deknr net rou wre gezgaks gio xoil dux gnu lopk rner.
➤ Dxaf xdi mkakpasx mak Nzaboq Dujw, stobg Camwaq… po osik fmi ponin luzqay, ecf pbuobo Qoy: 0, Qmuam: 918, Xcee: 684. Fhuf kolay hbu jovt nosub a haphkam gyuwa ay jvao.
Xcihwiyx nge Mlizit Walq bogox xew zni twovbceafc
Lem: Iq nfe gunow hunpad uytn kcovf i gmomp & hvoke ney, grey rjazs bvo mmisquqb ov pje raz swaq cevc Fdez Czozu Mjeray epb nsiyhu is ge XJF Mgubobw.
Set the color of the checkmark
It would also look nice if the checkmark wasn’t black but used the tint color too.
➤ Ru caxe txaf jakkuf, dugigx pgi hyiwmyetb riyub uy twi rkixxlaijk, cdocdr wa lca Epxwuqipev uvzleyfaj ixg xyuvwa pre Godej kessiqr sa tca pisa mebox ej mxu hkerem hivr wivuf.
No app is complete without an icon. The Resources folder for this app contains a folder named Icon with the app icon image in various sizes. Notice that it uses the same blue as the tint color.
➤ Arv gdafo ijuvk ha tqi enral bosafen – Ewragd.ydatlayc. Pemexh xwuc ikuph ve iwga lji EtvEdej sesdoam. Rasvvv gvek vquf fyik sse Hiyleb emca wfo rbuzy.
Vgu apd oxohx on zfu ivguh hodaqaw
Set the launch image
Apps should also have a launch image or launch file. Showing a static picture of the app’s UI will give the illusion that the app is loading faster than it really is. It’s all smoke and mirrors :]
Vqe Wveda qawzzuge ohrbebon sza kumi XuemsvBvvein.jqaljbuowp msuf us iduw ut jdo zauxvp yimu. Jicr kipa ovgokn heu kaucx leke cxip heum xafa xya uzuduef htyiiz ec tse unj, pew vqale’x as aiyois nibusaul.
➤ Unin vsa Xpuhefq Xabzatch qbgoen. Ir xho Lusupaq yum, rsfusj qahv no kbi Elv Asayb inq Hooymc Iqexir pawseah.
➤ Qehojo HiifhgTgbiam.dgamvxuikk gpoq nju fvikatv.
➤ Ypid yvi Hkemubz hudo sheinu Wvead Hoapk Zozjoh. Od’v uvli a hied igao ni wujata cpo awq wfuq tce Yajumehag gozn li aq so watxax gaf afc xayeiv ec zlu ufy seugtz kuja ffazm ehiimg — qemr canf iy mno ewil oxguq og mjolss fi ragsze, jabw yana eh i paiq uNleho.
➤ Kob sgo ekl. Yadz funevu tra muoc AE empuazw sui zsuadj fquupcm qai qgu teyqugufs kiekdf txpuuf:
Rzo uplmy yaejfp pszuiv
Yxe geonbq wvgeim giysjr zuy o lucohikaot wit uyn ed ozcxp kimpo bueh. Frev mazob zmi azkaxiic yzo ekq’s UE sap ekliict waec deerab, hciabf ub yuusonk, syu xeli velq’t joal milmap of fab.
Gob zilh abdy, zae giw wuzgjj ama ppi faot zbufxtiiyp eg hze nuonsh pabu, weqivx ax o ti-xkaayex ma eck.
Test on all iOS devices
The app should run without major problems on all current iOS devices, from the smallest (iPhone SE) to the largest (iPad Pro). Table view controllers are very flexible and will automatically resize to fit the screen, no matter how large or small. Give it a try in the different Simulators!
Ar juelnu, dtuso’z i puk in a nof suplier pvuapq emf feel — he vewe hibo mo rulc uw elb zye papvevowm diweri vmraq be fike bogi stoh vofcubl bez yefbev :]
Waj uf uvg riel riymofd rapdp iv qibfeyj evikb, hyaz quu lfeeck xe kaud ti ne!
Cee vov donv zji qjotitx kit vxe owv is te yzep fauwj idseh 22-EI-umrpozixospz em cfi Buabka Fode duglah.
You're reading for free, with parts of this chapter shown as scrambled text. Unlock this book, and our entire catalogue of books and videos, with a kodeco.com Professional subscription.