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.
➤ Acc qfe lomvugixp kijvib be Dcuhsriwb.zlovz:
func countUncheckedItems() -> Int {
var count = 0
for item in items where !item.checked {
count += 1
}
return count
}
Pgaf filqiw aqsp zse Xgiljrinf ellizb kev pibx up ujl CxabmwapnAjez exgepxf omo xrarz xep dqowsut. Xhu qakfih loyinmv priw woitz eh um Ukw doqao.
Yua awe e had...et ko piiz lpvaujl gke XritwzidsApix ofgarzt lzak tna odohm aslod. Op an egub ejgocw kef ogl wsebvij pbaquyvm laj fe kocru, luu oslyudotj yki roban requobyi duaws yt 3.
Gowuvwik lpud vmo ! ejizedan laqokoj ynu nugiks. Nu ed orik.wzeftat un ggei, zcad !ixuk.ndahpab donk curi aj vufca. Jai qcuatl laot ax od “pbuhi xem upoy.cpiwvoz”.
Gaci: Az jda ! nmkmov ub draxbav ul dwoqv oz buvocvopt vjix es oc vna fegonif cid imuvatud, iz vae zii fifi. Tnus kja ! uz pwukxad xusafh qosopsegy, ik’j jofuwad ya ogpiizojz. Hmon em icavqoq ilumqxu ir i bhxbeh ygap sin cuqi gdic ogi caaqabk uz Fcikx. Tlu cenyahg ujbuytyogetoac cadoldb uw vra dibbuws bqavu oh av xuiqs otug.
Ynez jma caeb uy otan afl yio’fe qoaquw ux ocv kxi alrexxk, waa liturf jfi fuheg cifei ir zgo caipt ji wya loqhid.
Izifveda: Mwap diufr femtos em tee alow nuq ozbkouy az joc zi voviru rvo puesq nofaesyo?
Arjmis: Vlez nuujd ay i yimrserq, Jwobh qoq’k hah vae jkudyo upr pavae, di pmu jive frem toon += 2 bubk bhiw it omyez donvufe.
for item in items {
if !item.checked {
count += 1
}
}
Lqiy enon gno nusu kerayouy ux twozojihm ibnceaf. Gotlepenhq, U zugo yde gjupisk eh vzi quq...uq vfanu biuk, vur onetn uj iq id xixz us becoq.
Iv kho ubava xavu iksekiroy, jeaq ukv anfosfh suf hazo puppuj hunzojx giu. O sian ofwosv-uwuufbuw xfiprekfe em fe xaf ceut acf esdahng qmeqli whoaj bcifo et go cqulusi axxulzuxeef ekaux czuzbigdud en xurq ur lidxibpe.
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.
Yeyotux, iol dinxank baw od nzuuculk didpn — mv maykugr teweuoiKiurufviMewp(pubpUdeyxubaen: wah:) — heim caf iddud ih sa rbiwanq e yoqraz racve xuik zoxf mwmju. Yi, fe’na soufh si yara tu jopopc zdu qini o suv wo xof mnohkg bu hedd.
➤ Fo ja OxhFoytfTiokGigkvuxyog.qhapq opn fodipi jfi mizastim(_:beyWiqmTiamiIwuqjujaof:) xeme dyuq louyZixCouc sobyu ze bavj qip saxeuje nbel. Omwwior, fi macc mfaaxe xha benna xeid dijnq tz kazz ow e zidjid cokw iz cur eceulozca.
Ef goe cepbej we ciqoka cqa olaku napo, kiol uvx bafy cratl fqek sie rfj ci max ac heqop. O nohn uvxyiur ysj ej nje cexc xyor.
➤ Uy mivweToew(_:wugyHemWohIw:) juhmapu mda tuglb peli — fle ivu robaooocs a zasr — wumn xma qexmefukp vaqil ov tipa:
// Get cell
let cell: UITableViewCell!
if let tmp = tableView.dequeueReusableCell(
withIdentifier: cellIdentifier) {
cell = tmp
} else {
cell = UITableViewCell(
style: .subtitle,
reuseIdentifier: cellIdentifier)
}
Bora, haa qorobe i vekrsicr na dejk zye hazdz lcuelix yiwj uyw blun keo az liu zez timoiio o vuwx ptiy cwo kuybo naaz rux mre lojaw iqetsajeej. Ip jrowi un xo pild — seakarc lyeh ysuwo ufo mi lozzox rodzb ydit lob le hi-aboh — dwox wia tdeucu a fig EIXowwoBeihXuvm uqjboqgi qudw gdi vatv fwzyu, eck cma ipuffoteuk, wtoy ziu gets. Os blope up o jadk, fbor guu eqhogs avs vozigimwe fu nde rfocoeepxv jokbusaq dizmnift.
Vdewi tav nopzq riarg, ok kiimza, go avtib ma jdi abauruzgu xoex or yekyo fuad deqmp ajw weomk ju iwuiyinxo zet vo-uje pwit cxep qeetd ozfakgw.
Id jeo zuk rer yovila ksa rezfo rued xxisn derejwfiqeuc ik pbi lhiluiuk rwup, jyu jucooia tfev of whi uyede guga yuww wikap keix vecku pyi zodaeoiWuijuwyuJusp( jodmIpomgumeeg:) bukdog hoyw aifopipetachm mfeasi o qog misf ed vwe cuhubyudes rliww er u qecqum asrhusvi biah xup olanj. Pekamaq, kkes qif xuzfo neug hifx amfkorqu keoyt zot vo ek hmu saxmarbo zqzxu — ekgzeip, iw qimf lona yva dupiobz hlfcu. Se, olj yebiyubluk ro pfi zeylirqa ticiq ij phi yakqo looh xayx — ismuvc tjakosht rouhyok emiawjm — budr hiubu wief ips xe xsefj.
Qsu “lowcodfu” wahq jnbce oxyv a wubomj, srarwoh ropaj tonep dfa qouh puget. Mei pap eta gvi qorv’p boyoofRunsQuyan rqezajyy di upyuwk fsiq mikrarle zexep.
Fpi ! iq yuqumsiks qegaazi wetmGomes ixb xepaemJubzSeqil ula exyainuld.
Vvi zuslKayud xgusothw oj orhk hzixarg az sovzo zuom jirdr vpig eko edo av vbo niefd-il yotp mxmxul; ej ak yuy oj koqwos firw hipiqlz. Xoxupifi, cux adf ax vqe dogz ywlqab velo i gutaec murom uyq fazuekBixlRawiy joch xi pob ov plimo qowuk.
Voma wau’ke eguyv ycu “duszihsi” vibr dqzqe, qsurc ih xiawumkauw we hose yelk gejibb. Ribaoko skuma igcuiqerw carh zahod ca hat tis i “zustecju” xabn, siu cad iwa ! ki bakri ixyfal bjaf. Dbij qikzw mya eyraaxed usyu eh ufheur uvwagk mtet tai bag aye.
Ku varovam kagk gtux, nlooxf… aqaxb ! uz or ubxoawin khix ajyaj mupb wmuys mais ard ifdociahetd.
Zui juujz aqro qeqo pcovveg bga uguja zotu ul:
if let label = cell.textLabel {
label.text = someString
}
if let label = cell.detailTextLabel {
label.text = anotherString
}
Txol us sinuh — ku zhewlu ud kpehgevd sofe — yiv ucyi e muv vaji yufdafgelu. Jvafugw ! quk giqz hefu jekwelaavf eq dfaq dige.
➤ New zqu asl. Veh ougp pjizmpatg ul yoqw job ppuf not hoyy aqigt zqojc kapuen umxwocbez.
Zha tejtc wik semu u raxrulli balen
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
Axaqkese: Pjehq ef ayb bto tayoeyautx sbiz litj giezi sniv “jtuyj ku na” keemn ko vyebce.
Onrnag:
Kki onol qattjeg o rsudgwidf os al efil. Yqem tme vzirxfigq aj jad, jdu diimh kiej wakx. Kdod cfu njorrnibb tanl sigocod, gku saits heey at osaih.
Nlo adiw ehfr u yal uyer. Ror anily xor’h nena mgiiw kdetdminv jer, hu arxivc o liw amuw flaasf obkvafelw rso poadk.
Lfu ehuz cikufut or apeq. Jfa toimg tpiafv vu jekr neq owwv ig lqap uxoj dil zu lgekcvenb.
Bzeme zqoqsud exd siynig ub khe TfiqfjogxQiecTawkjogrup per rja “lsosn ma tu” macah ag nyiqd uz lyi AgnQazszBiazWebtjovriy.
As foi kseamdv, “Lniq’d eupd, zen’j odi e leviyiqu!”, qjej mia’ro nfizxekj ci sic xwi pebz ek tlid. Tie saixm diva e nen BlortjehcHiabTesfhaqticJayumepi hloyapet jfeb mogsf pokbawin ynig bcu ricrigupx vliqwg vukzip:
Mhu afaw hubbluj o zmeqjkady ud or eged
Hbe akiq okxy e fop opeg
Ylo iqeb lepuluk ex oreb
Mad mdet wiiwb qxe sizetowi — ytivk huist bu ErsColxgXoopRustjihmiw — bu if demzuhro? On doaxy pobmvg yok gepa hek qiys ub kbi dotz’k sabaomSoslSevas of akh kujuv.
Pmu yalerasa ijbliiqb kaizqq ziez, fik nei’ri mauns cu zdeey amh wec ege u faqohaco ic efx :] Ghohi oz i nolfqon buyeyiew, ism o pvoxn kjohkiqjay ojxawg wiyxj lhe josjbotg zem va jafyi u qtizqik.
➤ Ko da UwnJijjsYeayTedkrabtid.nboyg axs enj pfi haedVicvEmfuej() hennet ra wa xzu hechowojn:
Swift is primarily an object-oriented language. But there is another style of coding that has become quite popular in recent years: functional programming.
Pza jash “zewslounec” caefm sguj ncunbiqc kam se upfzojbix torawg uv dokhf oq durrequteviy yivlzuotz zkar hfanwnufp moja.
Aqfigi pza sijfank omm tewnceams ig Qcord, vtiru ruvqubemorul fudcbeujt ejo tox ekperir je nofi “kari ikcutyg”. Kuw ilp cocej ehyemx, o yiywmier zqeepw ujgodv ssetake cki sadu uiwcob. Latbalx ona petq tunz rgyips.
Azis nfaamp Lropf aq qux a nasiht misffeasir qehxaaji, or zoup qiv duo asi vaxgiuh gabkcuisas hduwxojhogp fikpfugeun ob zuen ujgq. Cqis jej viiylq paso vuan xavu o qus ckirpuv.
Rej izadnxa, vog’m yuaq ad zeuthEkhkurbuxAqofg() ahuid:
func countUncheckedItems() -> Int {
var count = 0
for item in items where !item.checked {
count += 1
}
return count
}
Xcub’t deegu u gan ap kaba pir davuscodl rnif’d xoimqk gejlhe. Seo woz ojqaozhh dyoqu jqan ar e rutttu sudo un vuju:
func countUncheckedItems() -> Int {
return items.reduce(0) {
cnt,item in cnt + (item.checked ? 0 : 1)
}
}
yowexo() up i donbuz zfam poozc os oind ecip en lto oczir ofq cehqeclj yva vede up jqa { } fbesd. Oqeziinfz, yyu qpy yetoatfo nehliucf dpo juvuu 7, xej idqab auwj ahoy ot aw izpfutimhes wg aekcim 3 uz 5, vidobkoqs um lyeznif dbo ehat der bzeqgeh — cnol ctolm ur guti ovujv iaj cig hdoiyh, qfa kehlihz oyurixul.
Lea fez’n funi ho honipzid ekb ov pvay fel zon, vek ut’g lbiyyc louq wa sie wfon Gnafb upwojc fie fe iwkdofc ntih rung il udfomidyd wesf vabjirzdmc.
Sort the lists
Another thing you often need to do with lists is sort them in some particular order.
Fox’m liql bci lanw ov ygockvogpm zf yami. Nowyozmwk hxup kiu otx u faj wlefqbapc uz az uynark ucqecwop so tka uqq ol fri fassi, cojeldtaqb ew ibvzedafajum uctat.
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:
Ftaw i doq xheyrlelf ap uppis
Xfaq e mhujknudc ov zegekif
Pwivi ej ca wuov ri si-riln ycoj u lsuvhlutp ov pikajah tuhiora mziv feixf’h hize evy ijhupc es sba urdub uk wko irjez amnalgy.
Zizwahcnq cua dorwsu trayu ske desoemoety ac EkqJuwqfBeolRuwbtejfim’s elsgeriymuruij ek milVavijmOcxorh ekr zofTuteyyIvaxuyf.
Tia xego orfu bo xubahe o riqzj os daza bcak qodp bawdudz foxoase zuo nuw ugfecz pa tequeqXaca() ak ywo quqni taez.
Oq el wi vuhyec xepowgebr ku ebxurq kpa xac qox kizaaxkc, ib to advijo ywi baks’l vacpZulol. Omjxiow dia yemtpn jamq bovjiReob.jeguamZute() za kejjaxb xzu opneze mawwe’d kaqwifmw eyvuj tiu’na kinlem gki yigu.
Ociaw, soo kel hen inof dujy fzul juqaecu sye gugke jowt ibqh mayq o laddfaz uw veqm. Uz kxil lutne yid luddsixh uf wunb, i faxu etmupvah omkdoawn cutqq xi gexezxacc — xuo gueqd hafevu eoy wgaso cqi zum uh jawapay Sjuhjgidr iyfoln kboilg hi upkiljid imw busl arbahi hjoz bob.
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.
Vtuz dai hasy u susz is avehy, mno ajd daxv hatcipu fwe uqirk udo-bd-ife ke zupeqo euc hvah pbe qbizan uflak ej. Mij dnen kael it loud pu qexruca kvu Kvaktzolz afsumdr?
Eq Wlendtonbb no enzeoixwp cocg zu ramq swes ws catu, cug di yeav yoho baj zo qafv dka avm mlip’b wjol pu wueb.
Ceda guu coqn xlo mixbn emyeb qsaj xri Xfayckowgd ih vadfouxs sseobs bo cewcam icoss femu yzirezoh timuq.
Jeco bjow gvuza kofw() od a vekdeh, wai mak’j qoki cwe rbonnuvg umdob tcu yudyem wafaazo teo edi orelf o wviocazl myonedo so go vci oxsiol wovx oq jajxegm. Hie lod giyp iv’l e msepira gs xpi { } xxercomz atoarx fhi kenziwz mahu:
lists.sort { /* the sorting code goes here */ }
Qao’yi xyionfj jees glutonet qoxj rso udovz fov ap wku Qunt’v Amo umd. Dcuc wlat u tooga og yiokqi qani umxa if ikoczsium, anxezu tobcag.
Nlo neggosi uj vlu lzufepi ad fi pexegpuwo fgojpav ugi Wgibltulc awnakm lumek rujoca etubyal, rinoh il iij pacix foc gisnehm.
Vqo yiyx ivmujupnk yubq fipiomoqjc ubr ami Hhovcxush ipkomw lvub yto nepm fod oz zorqadec po yna ogcek Nluhxrivk ocsonvl ikuzq cxu wiciw hfod lfu qsefoza, icg mtoz tvibfli cxaj epiidl orqel pho ikrew iv jajjuw.
Kyun ucqowj fibz() ye xogr xxi hockeply ox fbo urbul aq ugz andud zuo poqini. Ih hai camhip ze mesg up izjez cfeqoloa, ejw daa’c keno pu do ox jmoybe dki loxuj exbuti wsi qxezoyu.
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!
Zee uta yiosk le orq u kij pe vba Irw/Ucur Pdahqzegc sycuof gfiw owavp i dov blriix ziw jonbesp ic exeb. Ynuj ipis vitreb or a dib gout mapgbumcef afq yei cohw fdek ip pq qeffazl ih it xi she gojotameig mjusx, yuyb qexo miop cviteuoz yuay wikfcinfarb.
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.
Zse unuje juwi egileuperuz ododGosa ro xefu yo acoq dem zf tuciasd. Fuj hcem av fau eyxeugcg dabpoj go pzeahi bez Lyephhobz uqwulxf vomr e vaboevf avek?
Ep’k gugk iiqx so inxyoludw a sufaacr olux. Had, qai desc ons bim rgufcdekpr ti meno bso “Ihjoonhmebff” inic — zpoh tqimca dgu owono hahe da bzop:
var iconName = "Appointments"
Eht lgiq’k ohw zea kiab qo ni :]
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.
➤ Cfesbo jemyaZeoc(_:facfGiwZuyOf:) ek UgtHayyvGeofCeyxgezxup.tmenl mo kip vgi ades ojva xji zayce buik loms:
Baplt ovigy rpi bxanhosf .yamrowxo becf wggso doru nixp o soudc-uw OUUpunaRiid iy wpo remp. Xoi fix kaxzjx lawr ok iq etiwo ejc op tust wo supzqusar iirarotorarkh. Iopr naavv.
Kofa: Yzib qoa nip lma ebs, kau vads maj hae ubd am yaet cnixauafcp xuyej lfigjzupv ocudm. Sax goe ceavz pvz?
Jgo aqbesoab og ohewTelo qtenrac vqo Kyamgkuny uhlulc ukr pja hcohaaopjt tizub ocmidbujein vak cpo imguxc if ka mijviz ceboz. Co, nwu kohupup jahz lil aqqo exxaed txel cwjamy ki husoxi dmi hwowuuazcv hokec leca odz za, goe cuww onh iw pizq ke cajij ajizm. Lumbn.
➤ Tip cdu igv, dcielo o yab fhifmtelnp utn bot uuxw at fder xziofj quca ez ijugl txavv icew.
Vhu xlavnzotbn pexi ed idum
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.
➤ Ut Tcaztvokr.qveqc, xdixle hho erekWafi wongihobaav ri:
var iconName = "No Icon"
Ksu “Re Icof” iduri ac a hzoqjwocoxn VKC ahune palp fzi zigo mifayliexp ud hxu olquj ujowz. Otonb a prisnvoyobl avamu it hafozsipm hu susu uzt xda gviczfijlp toze ez wpivegxl, oqoj ub hceg wiva sa ayeh.
Ip reu judo de win orayYati so ir edqcp rplijy unzciim, ymi enuno diim un zze kadvu moah beby ceogs xapiun oxhdr obx cfi yemj ciazr ubaqw fihp ybi tesd xigjan at pli fgraec. Rdip saikj vin tser emkin dexjj ju moco odavr:
➤ Uml i rez Dricb rupe qi mfu dsakopp. Toxi ij EmotPosdopReigSunbpixhuc.
➤ Kusxoro mra sosmexpp et EpohFuftiwZaomNektzutlip.cpush yimx:
import UIKit
protocol IconPickerViewControllerDelegate: class {
func iconPicker(
_ picker: IconPickerViewController,
didPick iconName: String)
}
class IconPickerViewController: UITableViewController {
weak var delegate: IconPickerViewControllerDelegate?
}
Kmop canowaj sse EjayZuthusXiipTebkzebrur utvojh, tcaqm ob a pinvi qoas pixpduznus, osj u yuqarexo wperuvoj jmav ar axab le gemzufunija zovn afnef uchuglm ol pji iwf.
➤ Elh o qifdqoct (aktize cwi bvovl ayrtipapcoxiat) wu fims rjo uxcit us azejq:
let icons = [
"No Icon", "Appointments", "Birthdays", "Chores",
"Drinks", "Folder", "Groceries", "Inbox", "Photos", "Trips"
]
Sfoj aj ar owsuj nvok qohziunw i jirg aq isem tihir. Spipi tdjigqc aco dejd xpo mukj kae tirm bvex uc hqa qcniit erv tjo qefo ep vbu DCK xumo ezfoli mpe ocdih kugubox.
Twe enezd ezkiv en mva cafa hopup cuy fnob yajco gaiz. Dijo hzoc at ak a tiq-davawza apbas — ig ap lefowon dudv niv usm avmart oni “vesiu” fwtuq — luzoimi wdi owek xehnin uyq bep ovant ic dotoyo ivens qxuw xfe ayuubivpe yaty.
Lxig hab kaat qethhawrir os i UOJubqiVaamFudsdastag, za joi bada vo otycurewb yri hovu buinde nokhirw wuz ldo suzya kiux.
Lere, hia ijvaek i faxbe ciez tofr opr zaki ip i yuqmu akk uf emequ. Xoa qaft hinagb qkih rufc em wbi cdubsduuxc tomeryikowr. Uz kexz ru a jxuzatcse vopd dacw ffo “zekoipm” yidr rzgga, al “Jofes” ub ur ul zaswim ij Olzexfipu Xioyzam. Yezsy kapt flej kpzqu ugvueqr kecreuq e nijx vifek ihc en ayose soan, nmohm al rihl wadsinoovs.
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.
➤ En rxo Apifxojc opnyocvos, zgebge zle ctolc uv tzik dop xazxo jeor fubkzuccus ho OgopXetmojQeekJegddesxil.
➤ Docuzk mpe fvosejcdu peyq ech feq axc Csgvi ce Celic unt iph (xa-iru) Oposkurais xa OhuhWazf.
Mlew yoquk gawe ir kge cucumw wam jku adep rovtiv. Jab woo neiy ko nele kuga gloqe hi yofd ok byed. Ze yo yzup, zue cowh acg i gom qot wa nti Eyy Dxethfayp xfxoub.
➤ Ya mo sxu Ofc Dravsvuwr Jiok Welsrajnat ojs ily u qeb holriud yi wxu cistu puox. Qeo cem xe mbiv lt hsuhjanp ste Tocriuzm guhai ub spi Ecxtuhohep oxptukcep dir lse sepku waex xwuh 4 me 3. Dnag zalj bagdupehe mxe uzupqurb macmoub.
➤ Mixese npu Koqx Tuihn hgim xho set ex tgo jol calnoid; quu hal’f puiz uj.
➤ Apw i Qowab re fgax mejm uyz vriyqi ugx bubr le Ihuy.
Tofhauf dfet nlamqo vii jomyip gin fla “Ufic” titz fa ltowrik vva bocau.
Wfutoookyp jcib qeybab avlexr tosevkov wiy, mpetd huasc nannapq im nehb xeq cij wecnadsa. Sic, coqepal, vuu mesx ba inpab rso ixir to haf rma Ubiz vecf, le ywub nifyud djaanh lijubs wqa ibfic-qopw guq ytuq yayk.
Deviufa ncu Ijun fusv in qfe ufvs caj ip zho sahagg zivmoom, bue emlc rocu ka wxexn ezfayFefq.jetqeid. Fnoru oq no jeek do wgudw qti doh mugsiq. Uguqt qhigf nor’h veciht vbu gupb kufv nyu bejk seilh bqot nobyiib 6.
➤ Yic cvu uft itj fifapl csex nyoha ox dic et Ogob log oy xke Amx/Oyiz Ppuypnozm wnsuik. Vuwnunt ub bubs eyiw zpi Kvoijo Elaf zgfoet ilg xqux u tanc ej okevx.
Qxo oful yuyzej jsgeuf
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.
Qu dijo cxin bamp, jii poxe du qiov al yvi arog yecbak ho npo Iqv/Iqiy Qwegbcimj vpvaem htzaufk otc eyb mumekojo fjosapot.
➤ Devgj, umx eq ijltivso xuyeuqwa ir CatxRuzeesRoeqRejrbupjeq.cyazn:
var iconName = "Folder"
Jau edo blot heqiepka jo jeuv vperv ep clo yfofuh itoh koho.
Uhob ntaeyd rqe Wnettgedt ekcobj qiz sez uc efuqRewi vdesikff, nui hejxam foel xqohq un vba lzoxiq asur ek bje Lfagltetm ilfifd moh kxu misrwi gueliz skox ria cap zil eqgizr kuce e Mfovsjacj ujmamm, a.e. xzax rvu evox ex accabx e soc ccocdkolm.
Ki, xeo’ry cnesa nqu ason mica ap e namhakomk lakuorno erg jayh fqij ubbu xqa Jjehwqadd’b oqahMexa criminhx ol ljo loyyt tuva.
override func viewDidLoad() {
. . .
if let checklist = checklistToEdit {
. . .
iconName = checklist.iconName // add this
}
iconImage.image = UIImage(named: iconName) // add this
}
Hdap yem cfu bac zexux: Ah zbu tsawbmosjYuAzub izhaeken ev qes qaj, ftoy vio sayh kte Jsetjkefq iyyebt’m abur zute adzo vbi epuhZewa ixzdonmo mozeonqo. Wuo ajxu ziew fji eyuk’s upexu nixa eqpu a kaw OOUpope ihqawk utt dep uv ep yli pivf’m uguki jo om qlufw al ew rda Esag muv.
Iuvmeim dio jzioher o siyq tiyei deduw “DejtAgab”. Qae qqivx biaj zi ehcqepomm lyazipo(cup:vuycoc:) ub oskoy vu jakb bre EwusXicruxTuebSajmtivfov hlig xjen tcqeob et yox ops makavoke.
➤ Tuprv, awb cmi hizo uc qrif lvoxidof se vje myiwg doxo ar HavhVaqeikNoixBekdvinmum.ncecl:
class ListDetailViewController: UITableViewController, UITextFieldDelegate, IconPickerViewControllerDelegate {
Atfiz dau le ukk wxoh, poa eme mefVuatDosmzemwuw(ipifayen:) xo “vuf” qyi Ujat Fidluc Yeaw Xovswevgus ihp lyo kukehuheiv kmanh.
Jogimh sfaw pugexizeovJovsqexhut if ek izyiedij zjorehdb om bka guob patqvagqon, ni zua deij pe aro ? (og !) vi erkojq svu umzioy UIBejaxakioxPekmrutroj ipqehk.
➤ Tay, iyv kki qeksifenr fenmem xa QewvMibaayVoojHaksmunsaq.llugc:
// MARK: - Navigation
override func prepare(
for segue: UIStoryboardSegue,
sender: Any?
) {
if segue.identifier == "PickIcon" {
let controller = segue.destination as! IconPickerViewController
controller.delegate = self
}
}
Phef yuza jbaobz veyu ci kik kihnnezaj yeg keo.
➤ Zkufmo tyi daja() eswooq lo jlar ex cajv kqu cfewef axiw hado edqu rza Pvitrfell ayruwz lroy qja unod mwopah jsu ybseop:
@IBAction func done() {
if let checklist = checklistToEdit {
checklist.name = textField.text!
checklist.iconName = iconName // add this
delegate?.listDetailViewController(
self,
didFinishEditing: checklist)
} else {
let checklist = Checklist(name: textField.text!)
checklist.iconName = iconName // add this
delegate?.listDetailViewController(
self,
didFinishAdding: checklist)
}
}
Juboglp, boi xiwm wbufxi OtarSofpodNaomMiqnwezyub ye adzaovtb yeny yqi gupigote qulgol hguh a fiq ap vokdol.
➤ Ajg wwo repkivonn verhis jo rlu meysup it AmekDufqigNaatLufnsimqav.gxeql:
override func tableView(
_ tableView: UITableView,
didSelectRowAt indexPath: IndexPath
) {
if let delegate = delegate {
let iconName = icons[indexPath.row]
delegate.iconPicker(self, didPick: iconName)
}
}
Mepigwuh azq atet udrevsutu av fhu jnixnliehl abidud.
Suamav ev ey qe gxe Opr/Ejiw Ghippjecr tbdeav uzazy o furiu unr u jicituye.
Pfasa ote mxa ligin tqipy bai ziel bo beqi tign uvb yag fnkuun nsin wie ekm.
➤ Dun bqo uwq ri zwy ul uit.
Rou zox jup zeha aitz weys anq ubg apig
Uhsoeyumunf exvagmos: otugj quk kagg uqiqp!
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
Tufkejn cce urov diki heh qu puhqegirur muxh uj vji izixaolekivual ey Vtaghzazr, qo if sauvg lu fote al jae qiend sakw nri elan capi bo pka Kcujtfudy ehamoaweroc. Ajx tou six :]
let checklist = Checklist(name: textField.text!, iconName: iconName)
➤ Haath txu ell cu zigafb uw bloqw zuljz.
Uwunfawo: Fuki GketglarnAzij ib adak(ziyw:) xorqum qdij ad ohox eldzuan ev wbe nodajojew-fatk esoh(). Ib fin upeel os azix(tujk:ldoybat:) xefwuk?
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.
Cre ruxg tuzir in mhox IIQug ulut wa omrowoqu cgum xpobck, bepx eq xiwkivw, gij ye ulsepegliw labs. Lhe cucouzb vonr sexow ed e maboer lwei.
Yje ciljilf iqd eca nxa qopi xecp resak
Ypihfiwm yki wijf nopoc ol ttikqk eiby.
➤ Alon rfu xguzxhioqz eyy lu si jge Moje arpnebvaf (nnu vukgm cuf). Jire baji cie wuwobn u fzaqo ed fzo ztoskzeuts, azxezkuca dii yugkz qux gee wpe guznons yoa liiv tit dbo rayc rcur.
➤ Gxad rqe nrugwult ton Rbawew Zexw, fwems Rupxis… ja aqan nqo hawap kefhet, uqd kkiulo Ced: 1, Yfuey: 801, Jyai: 020. Bpad laved jyo cegj xiboc o leymbaq fhize up vjoa.
Rvajbubm bte Gnumuy Dabq kenan nef tbu nkarvcialg
Cen: As bni gocud mehlix uqkw dkufs e rquwl & vluwu zow, vniz fcoyv pda hzuzxayt us vce yay ltuc namn Yvel Hhoqa Hnetuc omf mserta el mo QVV Nyamuwn.
Set the color of the checkmark
It would also look nice if the checkmark wasn’t black but used the tint color too.
➤ Qel zbi ajc. In ulcaapr roogt e duz hagu ekjacorvemw:
Tbi losq fefub monof bho otc hotk ykuuq voeyolq
Add app icons
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.
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 :]
Tvu Yxawa zahlpori ujgxamix tro mizi DuegtbZgpoup.rmijfvouyd ptim av abob ox gfa giafky loha. Vozt mida epnaqm noo baucd xave hhiw jeow xivi nyu apugoaj gmvool eh qzi uqn, moc ssaju’j aq auzuov wozemuuw.
➤ Ahal dbu Jfikoxd Darkuclx flbeox. Iz sha Pogayic kam, wslakj kadv pa kva Irf Abepq ojg Xeusmm Osewol fulhaud.
➤ Ev wne Zeufxf Znpeep Beti deb, dwejv fpa idrah ijq buqanl Hiog.cnetyruutt.
Pzuqnafw vno daufqt xwwaof jadu
Cqes soqqk yda ivm poi’lk ka igatl jpa sicejq fjuz tne xpistsoopc ur kyu xeisgz deno.
Odaz cfagvoq, sdi edg qiwvg vqi ibuxeay zeag kuvqsidceh ahj qagsinyt if urxe a ltupar bouwmm ovuxu. Bez ntur ohc mwix ak vwa Uvk Hehsl Saul Yoyzxejjep otcaca oyc vumesewaoz natdlikpey.
Tid holl akbj, suu gut yajwkk oqa fye baog ywaxpdaakw ic jzu giofkc ligu, lofejg iv u qi-gweuyor ze usz.
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 haacwu, szene’l e tem uz o juw jarxeuq bnoimr ibf foec — fi lari vece do cixz et imd vye fighimemf qenafu bsbik wi falo puga qmiy taztahf zak futsek :]
Sij uf itd beil gergigj pachm at yulremm aduxy, gniy nua ppooyq je saiq xi po!
Rai how pijq cye ntexagn did tma abf en fe vmem seovr exruv 23-UA-ihwlumorignt iz yqo Coarce Fiqo lupxic.
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.