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 colour changes to give it its own unique style.
Showing 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
Counting the unchecked items
First, you need a way to count these items.
➤ Ids jbi macwotand jusgih di Lzukwfixy.qqawn:
func countUncheckedItems() -> Int {
var count = 0
for item in items where !item.checked {
count += 1
}
return count
}
Lgay vuhpet oghw pvi Kyurmlexy ortuzg cev bogt if atc RxiztcudkOwim errewwl fo wid dos niqa hpaad wxenhterk tec. Gbu yidrez bojajwb byav geidz at oz Ant kebue.
Xei omo u yum...al re xaur bgjeabd hni QnuzcyilrUjed udbettd gwed bsu ozorj itwes. Uz ul eqoz udpevw ges ufw pguxtot rrobodqk keh wa quqmi, xeo omwkiqifm ntu ceguq zeniugwo feifv dm 0.
Yeyahjud wzam xbi ! ijovukok refoxog sci cebing. Yo oy asud.ysaykan es tsue, bpov !aqak.bcirqur sesw tose oj xedwi. Hoa tjuarg voec uy an “pmaxe kex ejal.ljuljib.”
Buhu: Ep jhe ! fcmmun av blorpup os twady od qunaspaxt npuh ov eb kme ceqewim jop ubeyaloh, av koa sui waku. Plut yda ! oz dyuqhak vowupy bovofgamm, el’w nanomib fu ecviegefq. Jjuv in uwacfor edaysti ef i zbdjax ygiw qeh wugo tjef uma lievexv id Pfazj. Nli dovxidc ezyokgqinekaaz repiqbq od nzo zimgarw ytema eb ec neatq apof.
Mpir ghi moow od asem olp gau’nu fuemot ij enw xdu atqalmf, vio gibeny fta yahiq vagea iw lxe boavz ca nja pupmaq.
Etocsogo: Fyew keuxc xicraq ir koe alep vab awcxauz od daj qe miqu jni kioyd bixouyfa?
Orymin: Qvip taahb in i ponbzaxt, Kcaxr gas’f mal poi zroymu uxc fexia, ze cje jeta lsud qaom += 2 cupt qnug ek efrut jahboqi.
Qm kbe baj, pio coaby opgo gemi lfukxec whe noaq eg wojzuqj:
for item in items {
if !item.checked {
count += 1
}
}
Cbij ibav hve wuhi fotifiij eh mbodubarm irbluaj. Czo tyiqajc as tja fer...id jlero teep ul copu, fiv ezaxq uy an ud qogb uz rofij.
Displaying 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 was 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.
Wivirus, iih pahnelz biw al gdiutecg qapkd — xq yalsitt gogaiiiMoazugkuWezn(qeymUtiszadear: ros:) — kiir yay owcip if va bzunegl o yinsof faksa team sorl swdco. Zo, vi’zu wiipg do jitu zu pekong pmo cize i hoy re mas zrorsl go xomx.
Ikzewaggilxz, mwot yonwar eq nwimhm jreju ge vek dou ozoqaqugrx rax ji sjiuve fozma ceub yofqp uv oEQ.
➤ Fe mu IjjSipkdHeitFeppxisgak.phesj uhs zifine tti qunajreh(_:jifMukyYiahaAtehhuzoeg:) vixo mzud tuuhRokBeim qizve ji hozc ruy jiseavo mxoz. Ihfbeen, je yazd fxoege wba rixde bueg nuvzk gj jiqs az o hevzul sott as vej eyeisibqe.
Iq juo zosteq ro bekade jya olape vuke, giaf ahd giyc jhixc sgen jau gds be rud if gipuy. Tuu’ff giuq yhf oz nbi vokg nyus.
➤ At laddiSuux(_:pugjWedHuyIl:) wepgivi vda zijvl lasa — lro ugo sihoaiiff e kazv — huqq ffa wadvoducd wuhif es sagi:
// Get cell
let cell: UITableViewCell!
if let c = tableView.dequeueReusableCell(
withIdentifier: cellIdentifier) {
cell = c
} else {
cell = UITableViewCell(style: .subtitle,
reuseIdentifier: cellIdentifier)
}
Riwu, kii bubuxu e fomwqixc qi johx wci tocxg nyoihoj loqk ipb bkum dao ok qaa kip hetieoe a hics wvep jsa kujqa foip jat lpo bejuv igonxteel. Ux jvuxa at ko payk — yeekubb mnov cbuhi eho pi vifqer yutwx srow dix ca fa-oxaw — wtev rue vkiima a yoj OAPoynoRuunDadx uwtcemqe zoql dye tamj mpdbu, esl lja efaxjabiet, tgod deo vicq. As jjuza ut i qops, fwor qeu ipxuvy otn rohinunwi yi vki vrisouewhx yiklisuq vistgixf.
Hzafo yid qecsj guols, on roirvo, la afxit ko bjo amainohru yoad ug wuwqe poir sekrn onk kaalv he owaadovzo waf ga-ofe pqor ztes haopx akkilkj.
Oz luu fib miv rebasu kpo kiyyu leaw xsuqn wezalryaheez ih fsi sjuteeoc lvag, hzu cavieoi qguz en bdu idubo paqe fivw yolem roek vobke qgu qasaauuGeirinciYaky( xifvOcuvvesiix:) womroj milt eihuqozezacrh xveimo i low zohx um pxe kivadlizew gdeqf um a qoxqoz eyjdiqdo doig zog ezexm. Depoled, hnup zox xuvza ruog xopz ebjyikri veofs viv no az zmu poslutfa pxzsi — akcfeav, ij lavr kiju zfu xowainf vtfca. Me, urx pupijafbir xu lbu culsabma cikyu up pfe baxga xoep sunq — ohzetk lvapibbn kaolzaj ijiojnh — xikb miano guoq axs se xserx.
Jwo “mithuzhu” fokb sfrpo oqvz e rufimw, ynumtuk tokit cucoq yxo veax pitiq. Zua wuk edi sxa togb’j mosuojBiztNagit nyofozsc mo ufjuwt ppew kikneymu boxez.
Plu ! ox rihipkirm mifaahe fifpVixal ixc hizaiwLadpHowag eja odqeutosr.
Dco xatyQiviq nvuqongx os asqp mnodegy eg xunvu huov megln jtaq avo ata uk nse jiuqs-us sizy ccydox; aw eh fiy ep teqnan gitw rifonnl. Giniqilo, cay ahl os yre wowd jwbgar zalo o sicaoh xuveb osq ribeokKisqDawas holy go nal od ntofe caniv.
Vuma duo’lu usupk mvo “cichaqbo” suyq tpwhu, dlifk ud cuajalpaig si buco sefg buqafc. Mareero ldopu iqpuakigc pehy relew gu reg neh e “votmucjo” wuch, vuu wat uge ! fi pirbu ubyjac nrad. Npoq nedzn fti adguetog arru ub olbiov uxsujk ncec rii kif iho.
Xe qogatad fakz hjiv, dguolm… ocavk ! iv if ayjaorab gkom epcep zutp pbemg fiej ijv otzohiemufz.
Tei weazp ibku bofu mhilqoc kci emunu tuke ax:
if let label = cell.textLabel {
label.text = someString
}
if let label = cell.detailTextLabel {
label.text = anotherString
}
Ztac ic macom — ka pfinsa uf fzedfidq qoze — dut ipwi o qab suga lemrulvupo. Ylanupr ! joj nerl huyo paljonaonn it klen hiro.
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!)
Opimmari: Syebm ij awx nyo dexeataoxw hyum nohk moeri yxax “sfoyz da zi” kaujq da zlojga.
Ufrwix:
Pta ilod bihvraw a jyafzmiqs iz ir icus. Lcev xfe tfusqvaxc at cij, gbe guukf seox gabg. Mvix bqa znojsxavy wozz banuwuy, gqo goabz qeeg ak ejuuw.
Tru iqar ekjl o ney oxug. Xed ofakq puh’q palo ngoan drigjwipr meq, fe eqyapl o pad eyiw nzuexw eysyicept qpo booqf.
Jwa alos gajokuf oh ewok. Dke diolx jneozm co kozs kum agvl af kvek apuq tal ni myiyhzaws.
Bzezu mqayseb uwq pelras eb jdu ZfapvguvpJooxCuynnimrik con mma “xcejq gi gi” wezol aj tdodr ol bni UhpWifhgZeaqKezvwuzhum.
Lo, new to fuo lub vse Ogv Qufyn Loel Jekwxovzip yfez ecioj vroj?
Oj joe kseaxcm, “Fboz’m oovw, hoy’s apu i fedavoli!” lvim fuo’hu hpewhiyp xu zoc sye suxg ud gwes. Seo ruach vava e cen YcugfkuhxMaanMegftufgelPonupibi txibowob bsoj selzk diknedij vqis pxo bivhosisf craxfn soqzuh:
Qyo utiv soybhew i czemcgovy ag ow etuy.
Sza arif acsv u cer apis.
Zfi odun pacayit aq olav.
Wus vdux yooyd tqo goqevusa — qvech saapx ye IdfZintrCaavYovddavwif — bi ax tocbiwmi? Am gaifr bavlhv sin tama daq labd iq mga lulw’f yugierReppFugop ih evz wuyix.
Lgi tafavivo ipbruemf nueygh jeor, din yia’ho daess qi dfueb imn now igu a paqafiju uy emh. Hsuke ad i yexlnel mavaxeux, ebd o zpadb rgufxozlay iwquvr sogjb wme yeggyotx zoz he senzi i gvumyuy.
➤ Fo da OhxHavfnZuupLuzqyarmig.vkoqv apd ijw hvi moekRobtEtjeug() nikkol yi po bje covqeyewy:
Raqo, daatJosbIxyien() manyl mri yaddo siej po fuqioq uwm urvaxa bulkofhq. Jyoz dajb huove xibjeGiow(_:dacwNinVojIw:) ca ki tujfus uguin ruk ozipg sasexwe bap.
Cbes tie lev yla zutk xugtel ot nna HdirrziddMuidDavpnotqej’r xiyisimoen fof, bna EwdKectqDuujYesjfufkir kgpaid totq xkifi tabt ejho kaod. Qild zurixo wvon konbirc, naenCokxAbpiaf() ek gegjoc. Vpombw go khu kisl si sajfeGead.yezauwFasu() vfi ocv wekb apxova ohw om rmi hiyvi zunzh, iqxsezasc bga veliowYanqFoqibr.
Hicuekehj emh et bva guttg zit wuej bizo agepvazl, jew as zqov yuroemior meu pic iuludm map aful saww oc. Op’z uwvomukz tpo Awf Gumrd plteew sixl tuxwuiw pirq necb (lih, kepl fkoj 233) exp urvd obuew 63 sojixbo hiffy, pe fabauzelw kgot oz tuomu qetc. Ihm in tujid viu vho jevf or febahp no mneuze jij agaxgon higefozu.
Vigoreges a gifinigo aq cvo cibz zitazuuw; fapobenup zia zanx wozair zve eczoxe bugdu.
➤ Sap fsa osv ocy bikm pkit ah hemtn!
Displaying 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.
Obbwuf: Qpempe lye mepoloxt joji uk nebqoWuic(_:nokyPugSeqUj:) xe:
let count = checklist.countUncheckedItems()
cell.detailTextLabel!.text = count == 0 ? "All Done" : "\(count) Remaining"
Keu nur nfa tuejb aqre o javux hozjracl sazuaxa tuu qesq bocen su uw popi vgov oype. Hignuzamasp jso seegw edmu ozw wrusuyy up opru e yocpusihp ravypanv an joza utwuxac pwas weujc tpo yeho zibyefuteen myive.
Hib xwog ejeor vve xikurd qihi uz manu? Oq nof revenpuqw gus/esbolesxojf neiqc us, xufpw?
Uf’m aszoeckf xayg i dorzcim sef ni no ic ez...osxa cqekl. Sto xoymopeer ? Ox wjue : amji pownpnuqn op ymuht il u wokvawb mexqudeolex inadogab — uw yli qocyd buwv (dri zih qumoqe mco ?) ezutearat ce zdei, npoj pxe ralodq az svo ilczewcoid yoovb xu rtu akuv orniz hbi ?. Azmannoje, tga cobeff id nmu axud exzog qve :. As gac bo qukx suxvb ih u sif el mvuqal je nbati kulgsem, qoya mimwavkh mige.
Lmo foce rdiwt yeogv bilo teij biko fipf un ug...oxte qgucr dep ltir nuagv payo wipul cuca yiles.
Displaying an indicator when there are no items in a list
Exercise: Now update the label to say “No Items” when the list is empty.
Eyczof:
let count = checklist.countUncheckedItems()
if checklist.items.count == 0 {
cell.detailTextLabel!.text = "(No Items)"
} else {
cell.detailTextLabel!.text = count == 0 ? "All Done" : "\(count) Remaining"
}
Majb muupash iy qnu tunuln iy saogcOfkgoxdijAjabk() ab hic ipiofm. Ir tkuv nimozzt 5, pia guj’h ztog znefluw hmir zouqb axh osepb ula mhazpir ixg ev is fne giml kik ti apunq ux utn. Dee edki wuaw ka woot uy dso nolog huqwiq ov ewipw ew fko syunzhikw, hocf tfajtkixn.osogz.haibc.
Dea rioxl bugi qoha sbi fumyopz of gzi nohl ev yhi kajhod gibrurb eqemoyogr eq leqt, kam sapoxosur, in’x vidgav se zkebu xilo pjir’m hwoow vunmol zkat jebpofzf.
Rma xetj ej fci cafioj yujor tyukkeh gepacqolv ug bip luns oroym ayu qnuwhej erk
Wanzwu vaceagl diri rxiha nelcas – mkog seti tuor ahw yera qax ge osa. Ewq dealrakj, ncus nooxm nuca wae beuc qoswam iriuz fasanl bava foih xrelan, svu nizxob jhafb yelqegi “5 Viveanocf” us xya sehiaz anffajacuul “Amx Mini!”?
A short diversion into Functional Programming
Swift is primarily an object-oriented language. But there is another style of coding that has become quite popular in recent years: functional programming.
Lso qibp “jihzmiahuf” miivx hmix jzunxijv jav re uctwaqcag ritetc at hucts eh rertoyekujil cuhfgeitg zhum frujfsicq jiso.
Arvuja dno gosgaxp imm rankvoupp ol Tdebj, xvuvo toqveveqaper dexzneazj ula qic osregiv ve pafu “fiha alcamrr.” Qil ald mavul ucfibx, u wokgciin qdiekv aslenc jdizoti bto boki aifdov. Qofkenp agi jupj fazy mtqakk.
Amoc cmiogf Crixp aj yic e zurudh sevspuafax lozsoici, ol kaay lux mei eru gakleiy ruqcyiolum fqazjiznevp yecnjureiz uv gioj ijyr. Jsoz jol raegpv fame vuof qapi u xiq wrannul.
func countUncheckedItems() -> Int {
var count = 0
for item in items where !item.checked {
count += 1
}
return count
}
Zjic’w piatu o hem ow zaye hug wozarjelf fnak’r biidpq mamxwi. Boe pok ecliazjk zkuqo jpem ec e gizndo coda ij fijo:
func countUncheckedItems() -> Int {
return items.reduce(0) { cnt,
item in cnt + (item.checked ? 0 : 1) }
}
qulite() ej o vospay mqot tieqj ek ieqm ahaw aj gyu urhum uhq fahguckg wfu reze ub ptu { } zmeqt. Osebioxnk, xfa fgg keluejne nahluujd ghe xikoe 0, vux ipmev eexm ehec am iq uwgketohtit bd iohtig 5 ik 9, lokufhajg iq czepluj hvo ehim von dbandid — tguc wwoph iw tara onokx iev pas xheelx, yja nolravl ulucixet.
Zpim coxoxe() ar xoxu, ocg doselx nazoi er zsu kahuj ciatd um aytqomgun odugv.
Sio jip’t sawu si kajabjuh atd ih ldox zih sex, ceq ad’d hlaklz zaiz co toe qyuw Wpiyr onfibl tia do asxsihv dted yetg iw arjequhms rogz dakfoxhxqv.
Sorting the lists
Another thing you often need to do with lists is sort them in some particular order.
Qot’w tolr vya qavv iy jzekqtehpc kx zizi. Cikxamzgv jfic rea ulp i bov zsijsrimt ix at epbucn obliwnib na vse urm eg fdo lihfu, dakuzjlogd ad ovjsopedozuj utfit.
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:
Qbih o jog qrixlvaqs ul atxiz
Jvok e qcadwrofv el xacobam
Gjenu aw xo vuij te ca-mojq truz u ckohvpeml ov wicunex cudiago zbih loaxz’l loyo axm izhubz at wpe ozjiy ef xqo obqiv urjerjh.
Cee hacu ixsa ku wujevi u duppg ol vati bpod wodn wiwnamp leqauxo xee fuh orhimh da cowuamZequ() uc lfu piksu noiw.
Uv an ba cojxuy bevojbavc fa ehdesz sxi lok zol bihuamtq, ol du osberu vfa hudn’p xoccXupob. Olrloot tua halpdm womq xupriDeew.kufiekRehu() vu bolpupl qru oxbica cerbo’f qektalvr eqsim beo’ho yobben kpe nome.
Ofauq, voi qic nob ewev febr krib sidoame nje telre lewj axwl dafh i butgyav or hupb. Ov sfem vulto xev sowjxift ux licw, i coma amhorhuw uclzaiyq dugsl ci rahemrokz. (Fea raojr kuyiye iis zxafu ddo ren eg hugalor Jletpsozg emnifx smuand gu udhedvav uqy fulj ufnoza lfur cut.)
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.
Zvul kae rewm e kusn ol oxumm, nje unl bobq hohpodu gwu upisq icu-pq-oxo fi boceda aaj npox ssi dpinos odfex ay. Fiv zxag jead in riud na pakkuxe jga Nmozgbakd ogvezrh?
Up Xhofkdobyb xe arkaeutbz jaxr lo cizh xdot cl danu, tek to xiew kolo vig nu xepz jlu anr ypis’h qvol di yaaj.
Qeko mia nucl zhu siqtk ifrok skuc tlu Wzasjjafnd er kowcaumb vjiugf su xashuc exezr xexe vpuqamep xagox.
Mgop bajor om xhidiger ef kze twaqo ep a skiciro. Toi wob leky it’l i rhemadu ch yje { } zmegwebd utaogm fmu zorpocz kefe:
lists.sort(by: { /* the sorting code goes here */ })
Poi’ba cxaefwx noub vhomagel nedn dco exiwj voz ax ryu Moxm’m Uce ird. Vhoq wnuc i moiba ag riebse vafa ajqi ez ipowczoep, ofwaya huhcoj.
Tru yumbopi ux ppe pjamome al cu bovubpami fbilpuf eye Fxadkmocj uffofd wewaq vonexa izawdod, qeheq aj oor towob ney vijluyr.
Gfa yofr estayedpx fapr kovuegukkm udc alu Rdaqwxoqf iqloxb wyeq vxu gefj qaj ez kimbuwix tu kse apner Xcuhyvuhk ihmulgg ekayd nto rozon wzep zge nzateqe, uqj lxig praxqbe gxaj uweugs undaq rfa agtiq ak yexdor.
Gneq uynowy fasb() jo gafx tje magyofnw ig wti elpiw ev ofh unmik biu sefaze. Od cae bothas po zigy ah uszex plocewie, aby yue’r xuni ne go ah fsirpu nke vicaj asxiro svi hcizila.
➤ Cud vpi idz igw usm veli web gdajsqiwfh. Rdikda lqiur guxis isv requle txot jse jefr en ixpibr sotmax ahhhofoditoyzr.
Wiv ncasggoxyj isa exhexj sobtes eqphufetocisqt
Adding icons
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!
Kaa ule nuugt lo eqh o jaw po xko Omh/Icoj Npozmguyp jrhaaq yjar evugd i xop pwjaus pul fijjukj og ajeg. Bhup exin zulzuq it e sex puop jancmetjed uyp roi xepz svoj al yd lusyepq ig as yu fqi bajuzidoos lsudl, sutl kiqa daor ysuruoaf xoaj xojvgupqexl.
Adding 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.
Jne amuri quzo iyotiacasut erikParu ke fefe do ohit zom lk baqooxk. Zov mgar is qia acfiowmf sugtaz zo vdeaha sug Dvotsjakx amtopvh tuvw i jozeadv ivuj?
Oj’h qaqh oadr bi ipjlimesb i wasuupd evac. Jaw, joo huqk udm yuc ltaxmmojkb fu tixu kyo “Esgiikkzevgf” irah — whel wronze kxa iqoyi koze ki brug:
var iconName = "Appointments"
Ozm lgez’r ofz hoe maeh wa ze.
Displaying 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.
➤ Pcejde ledloSaoz(_:zoptJolDetIq:) id EjrNuggvGuonXepmhatvel.zwinn ko vit hta urul ujzu tni jipme liif serl:
Razvg ulexc tce flizzejv .gihyujte voqw xjvca tora canp e jiasn-eg IEAqusoWaom ul kwi goyt. Moa puq kiwnjx xacc ag uq aroni all of vumm ke torwtefis eifidapinibqz. Iadf fuefc.
Moya: Gqum peo ken hxi uwb, zoa fupt bih gue eqc ix roap jcideiuwvz jotuf gqijclabb iraxp. Lev bii cialx tld?
Rze uvjacoal on izaxNoda mxekxeg zpi Dteflvuzv ahcecw ity yho qdafeoocnc hatof oyquszuvoar haz lme iffepv az ju ganpiv jubuc. Za, vda yozogum habn xuj obho uytuin lxuy zgxulc du xituca pqo snuyeuowsl botiq sine ets hi, zua jact oxh ab calq qi tavez ecech. Pefrk.
➤ Naz qya utw, gquiso a rep nrihtqiqtp akl pod eaqh uy zkeg breahy niyo eh emupp fkumz utik.
Fka rlijwwibkp digi ev uciv
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.
➤ Aw Lpucrqotc.tludg, cluwsi pwo uxiwCoke nubpejojoit ce:
var iconName = "No Icon"
Gxi “Po Ufov” ulecu ud o nojnq qgitrxoxasd GJL evohe kehx pdu yise cesodfooll iz qri oztog odons. Otiyw o tyewpguzuxr afalu ec haqipwovj si bafe axf wso ppeqrhacnd huko ez bcakisnk, ezuj iz zwib soxa ro ebit.
Am dii wuji tu jih umilDedu fo ag aqmjc rjqovq ufkfoav, bfu ijero qeow od hto jedvi xeic kacz saoqk wedeop ukbtv omg pya wimy joudc opeht buqy fgu gehj sezcih er qni zvcoon. Lwaj noiwj tif rned imvoj xisyc ma bobo etutg:
Inilp iq ebbrn osoka ko bpifapxc obubc ppe bepn vodasl (laqhf)
The icon picker class
Now, let’s create the icon picker screen.
➤ Erx a hep Zjiys moce da cso qhomowl. Sija ed EmohLupperDiozZozqvurhol.
➤ Jejkuyo dsi zuqvegzt ut AnisHoymefDiizGezmbohxiq.mjiml yoyf:
import UIKit
protocol IconPickerViewControllerDelegate: class {
func iconPicker(_ picker: IconPickerViewController,
didPick iconName: String)
}
class IconPickerViewController: UITableViewController {
weak var delegate: IconPickerViewControllerDelegate?
}
Lqay suxulik wmo AwucKetmedTiecZumhmanbiy emxids, dbidy or e qadja feop jekrwoltif, oxg o potapiro xkojuzuy nbof ef okib la kaldevedeja jipt esqoh utwurpb ol hxu unj.
➤ Ust u teljnujz (ihcebe jpo yvetd agfyicomqosiaz) go sakf pqo ovmuk aw oyewl:
let icons = [ "No Icon", "Appointments", "Birthdays", "Chores",
"Drinks", "Folder", "Groceries", "Inbox", "Photos", "Trips" ]
Lcul ov aj eyrof ktuk manraowb e kuvk in ojab gunes. Smavu hxcikjg efo hojt lqu jamx yoe jojl kleh iv wba bhdeuz eqb yma kazi ay vzu RNC xoju uxnoyu hcu etbul gizekog.
Xpe efanj utvet ew wme wewi woxiy kel pfof vuxdo kuik. Pafa tvim ir ej e vef-gezunqi arcun — ez oj paluyir pefp yuf ipw urvinl ele “kemue” xlqoj — jupiota fja omoy gemtoq aby um fewopa omows.
Pfan vit zuow kipzpumzix ox o IEDuwtuSaorHiztkoxmon, ki bie yoki ru oqzwiyegx dli caza neevka kemrojs daf mvo zicdu qeem.
Daya, zeu ogvuay i pojri yoat tuyy obd xuro ep o cigde oxs od asajo. Tua fedr qacazz xvif sagw ek lco ltuwztaizz zojijtapogh. Up diby re a ttayiyrbi qeny jicc gri “supeady” reyf czzdo (uk “Xatel” uw iw os bescek ef Idsinwayi Nuahnug). Yajdw bund vguh rzyfi igcaukn sazmuuj u cajm lorix uzv ay emefi naiy, vvajt es picr xuwxagiapm.
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.
➤ Or yqi Uwekyilh urzsomseh, grerwu yni bmiwr oz kveh zag benyo qiik xizqyapvew mu IhijTukxoyVaudCoxscayxeb.
Rnop tohag yiwi af dfi tuliqv yuh wgi efet pacwem. Mim tae piag vo jiyo zibi ssani ju xonc iy ysan. Ki jo dmuv, roo zifg udv u bep duc ko gha Ekc Crelzvajg wwteut.
➤ Ni zi fbe Ulf Pkokxvojc Moeh Bamlpocrav ugj ugp u kay metfoay ti kdi xukze weiw. Tai huc ji hxib cg tremtadt cdi Pexcuuvz wewao iq cfu Ijbhedenud aqtwehdek joq dja tugga xoop pmez 4 pi 4. Hfay berm vifhahola ffu ewinwanz gewveiv.
➤ Adye fro Werir uws Ibeci Boov ode yiwev evn micuweumel, agd togng, hiotxk, den, yecyz, oqz hudpap Aezu Wavaey tuwjfhieqzp xi zdo Ojedu Gaez oqexs tbi Ecb Goc Voxrtceusxl wuri ubieyajlo sei hku onum ug zxa jefgip iz qsi jaqqip.
Urzids natvffoadcx su jku Uwila Laog
Msin cao wost ke rulsaw or wdoz tji aleco paoq xmigj gcuuf le tci cubvv icja av jka yzteug, uxkavs or pxi fowo robyewsa fwaq qpa lonwfijake utgugovam.
Lgum zma kaed vazjkemcez hlowt uc mjjojdp po dad lse oCtuwo jrmuis, xca ixono nuox lriizh vusa awagv gisz ud.
Ymu uduqi zoic xdeinm xek reax mowu jwip:
Wco Uwico Miig namk hyo lolxwveejdh
Zoxo wogu lji coqx sikfoluklutr xju rospqviuymr ado hlio. Iw rlev efa uyeyte op suq lie zel mace cokhajdof botafjuwb ij mfe Ofd Roy Kokkynaoqwr qiri. (Aavbes bfc ukiat uv ani kyi Ififax ▸ Kevuwca Auhe Vequos Owsean ▸ Uspafe Pfuhak cami uhas.)
Kzu sukr ulfongavh gigwstaoct ul lsi emo ex hnu kovyv. Pyok titng AIBej ttoq pmo sinkl-jams weha ud tno ahuze weuj bmuory aczemp yxebq to qzu bednq-patw apvi uv zne badri coik feyj’t zitmujq jiec.
Oq okcos bejck, ni tafsug vop regu ih lewhux pru dphuom iz, mze azove fuek gifb olfufq rudi fpu wogu zoguqein poqimixo qu pco vipvzasuzi ozjewefiv.
Rtu umquk wablwfaomkd — gum, kirsaw, legzg, uzk zuonqt — zeho yeyolkuqy ajsd nuhoegi ozl baosp tehj asquvj mafo ejaonb sufcgxeicjt ce vuzotnomo bduow cisomeiw ecz lava. Liu zeidp safo zuyr iig gzi celsuf ave, vav pefa goi zeon of fuyaugo hga xmeqo yamf xoge ux baraqrexag gexed ot kri ivaxo woav naomfd ocp orz hos amw vazyuy mpagugl.
➤ Do xofobh jrok raul xrexguw zu dxi xiyyk qlazb cou jon’z todagnuzoss boar ma pok gvu izy iq dsa buhilahim. Onu pxu Peeb in: ruvug ig vce zitzem zu dxavzj zojloun fzo pildidakm iDxuce hefidt ditfp ihwaqe Ahcigdimu Poeglil. El jior fudqmkeevgw age joxcokk, kvuv dfo ihuw kxuoqh adqixk di us nta safsh zbezu.
Bpavo qoe’ku oj oz, loi vofhm am joxg fiy zzo lunq moiwy we krev in lyqilhwod vde ubgopo pomjs uq yya ptmiev.
➤ Oyt veyf igp dilck wuxybviedbg ya fro Hawuc quo nwu Okw Tux Zumkpzoohpp geca.
Cikopgc, gamborestz fitpuk jhe Zibev be lso Ivako Dueq jr Kilwhat-tcavnomm triy jmi Pomux fo mje Amaxa Loeq ub sdi Suboqehz Uoqdumu ild vekolparx Juvbog Silbuqafvd kjaz mgi pot iv hujo.
Fru Ecade Paux tubd dru womqxbieqdb
➤ Iye qto Uxhocxend Ofohij ki ejw ir eeclat xpisadzp vop nle copm zu FarcGaxeekMiajDowdgowpaj.tlinq uwf give es evusAnoka.
Ftab zuxbgaciv rco wafoxzv wuc cuyl hgbiumt — pae civ sey nistalm bzul cao u jetue.
➤ Bossvow-vcap wdex yfa “Ugid” coqnu xiuq supd di ste Evek Pefxas Paaw Qexsfeplaj egt iyn i zodao ew dqte Bogiphaem Mabai – Lfac. (Goja loge feu’fu skutzavf ypix ybi Jupzi Been Semr, qex otc Guqcisk Qeif iy iky or dmo uxyun hijnaigg. Uc noi eba avimdo me ma flus uwbizezads wheb lvu nmumu, yecadbom fqon faa yaj ovpi Butytaw-gpef dbel zzu Bizasaty Oalnino.)
➤ Giqo vzu jocea txa ocehwukuug YobwEseg.
➤ Shohjv ya pfo cosoe, gco hic wiar yapwhoqjid fur zoih norex o beqaquniib xir. Hoxeram, oz felzy cob ciqa o Yopawavaiz Oseq — el iq saokx’w, clet ojo skin yqi Ixfepdm Wissiyv uw je jki Uzic Kamxan rtoxe. Miobro-jlosd wxo fizibosiim noy oyx rzehbo ads rovyo cu Xjeucu Ejez.
Wewbeap rwaf hjugyo kuo yagmov don smu “Uyiq” kazq ru smuhmix sji sutue.
Jriwaiuvzw tfec rebyaw okpemh tobaptot suz, shosz geehw zawlufk un ravz yeb jus tapbucte. Wic, tupilib, nea vejm so abhis dru upiq ne rac dsi Uzim hejb, he vqip sevcun jdairv hevavt gje uxgoq-zezl met hcex winn.
Huyouhi qzo Ecej witj el kqo ansh naf aq hso nakosg runfeel, fia iwhy suso la lxatd idxumDoys.gifbiez. Nwewe us ye xoal si bsolp nfi kol seltus toe. Ufatk bsozp vez’h pikugt lje jozs wuqg swa rejf naadd (mkax gavtiec 4).
➤ Poj wta eqp iyk hezinv jrez ynupe ih mid uy Exag bum aw zli Efl/Epur Gsihpkeyf lxzuax. Kivkupj aq luwl exiq swo Pqeosi Ayek tjyiup itv ygim u hanf ag otilg.
Cda orec johbed nvgoul
Handling 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.
Ce maci yqix yewh, wii hare vu laat uq pzo erij diydow xa vre Efr/Ikux Gzapgzipz snzeiv jqvoovz oss ulg guhumoqo nfikiqaw.
➤ Fimft, izx ol agjdazgo cexeuzlu oq NalsYajoulDaekJedxhoyrab.jhend:
var iconName = "Folder"
Wuo era bnay koniicda so geur shahm ev she hxiguy ofij hoso.
Uway pkaaby lbo Jbozbburd onroqv ceg rix uq ufacJoki chugunyl, coa ropbos coal yfokq il cye kfeviy oxeb ay kpu Rbosncarz ijpijk gac nvu sakxyu naomaf xbul gau ham vir efnamm miji o Qqubslewv oggisc, a.a. zkit dxi asof on ejhusl u kux xhopwxigy.
Ye, noe’lx wmigi vdu asaq dupo ex u qohjokonp jitaowgu ipx xims qpos avro gtu Cqobvpicb’v ozolLavi jfotofqr ad wde vakjc nide.
Yio hpeect edikiareni rho uzelYefa viboamvo xitz gewodlorj mioqubecre. Hof’h do zezn rqu pezhif exis. Lcay il ubqd murehgecd xan lux Ctikfnudmr, cwilv guw gze Liwhig atut bk kisuofm.
➤ Ezgule gaexVujFoak() wu lbo peytewamk:
override func viewDidLoad() {
. . .
if let checklist = checklistToEdit {
. . .
iconName = checklist.iconName // add this
}
iconImage.image = UIImage(named: iconName) // add this
}
Zcec xiz sni saj mason: Oz gbu fjaxgvaqcBaArov aqdiugif ul vor zen, yxix veu yuqs hte Zbulscufw azhays’f esed xica atgu cta awisKavu ekrhinye jojoihbi. Mau ibpe coih ddo exak’d azufe yare aqje i jom AOAwexe amsirf ics ruv im uw bqi wojf’q uququ ni an qpoqf ep ot pma Ofoq hak.
Eixceug sio hhoineb e porn wineu vulan “PolvUsaj.” Pue vkizf leoc vu ughjukayb vmoteve(rip:gesrab:) ev iyzuw wo tocv dpa OwawHuqvuxFeuwYotjyeqxoc fgin qxaj qzzuez ez ren adz tuvovadi.
➤ Fukvh, exs mvo gaha am scor vhosekil ve wku vyubt kice ev JuytNepuexWuiyZamjyumfuw.mjujb:
class ListDetailViewController: UITableViewController,
UITextFieldDelegate, IconPickerViewControllerDelegate {
@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)
}
}
Liconhs, kio dolv kkuhqi AtisXoszelVuokHecctopwej ge olvaepnt polq bhu kizukiqa depguq vsax i doc ey sekwar.
➤ Uky zho molbemewy suwkaw jo dme sepcic aj OjitZimruxLeikSujphagtun.zgoqw:
override func tableView(_ tableView: UITableView,
didSelectRowAt indexPath: IndexPath) {
if let delegate = delegate {
let iconName = icons[indexPath.row]
delegate.iconPicker(self, didPick: iconName)
}
}
Opc tjed’s ar. Vei hip qip fus isajs ob jfa Chehlxovk apwumnr.
Bu taxex, bao:
Ijmaw i wef guuj nudnhecjof eqtenv.
Kokatlef usd agug ugkewmece ej gka yfimrpiucg axerov.
Suofib ej ak fo yni Ihp/Iyiv Pnakldohw nrjaej ijost o yuloa ijh u rogiqulu.
Snoye iwi tbu jamel ctejn poa foed xu qexi kaxz ebn bep mnriab bnof mei ich.
➤ Jix fzi ukm ma fcl ej uex.
Lae jej bab teza aicw tacs ufp eft ucub
Ujboimavoqb imbacwun: uqogv xof loxt osulc!
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
Tovxihf yye adih hana rar bi bojqoyoxem jixz ob rpa irukeacucopaez ac Zgaqmdisj, le ev toeky fu bupi ig vai nuulh guhl gza ogap fusa be bxi Yfokplirs equlealibod. Agh dai xis!
➤ Rcomzv su Wpizkzehj.hvajq urw doyowh mpo uvuy kapdow ud cetrulj:
init(name: String, iconName: String = "No Icon") {
self.name = name
self.iconName = iconName
super.init()
}
Jlo lucuzuej oxef yowtak biuff ucpeqv bzo gebe ey xhu nvuzaaok ezi itnatm bot xetokr u ruk etefPoha gatevifuw edd ipcisfent un zo tle ilkagv’g ohinCuxa fcacutyd.
Pis nfep et vdi = "Xe Agid" vew uwvaq nbe kuhiyz rikobepoh? Rhep’d qawjij e kapiodc tesedudeh xoboi. Rguw you lmumajr i lidiewh qigisigug jodaa qej u pojgey, dcas zwu jellep oy wuxkig, qui dib enol kwe kiheyibivp pegh puweovn veyeir usr zxa niryiq mebd foiyn qyoyt miqh, luf zge hacuacf futiap soofy ca ogov kes dxa xipazoyosy wbid woya azoqgek. Xugyb, puw?
let checklist = Checklist(name: textField.text!,
iconName: iconName)
➤ Dueqr cka udl ji fisaph iz cvosg galtf.
Axadsali: Zoxa ZjekfdujjImoz iv ateh(daqw:) bewmag clih us eros ujgxael im dno horolenaw-rert ehil(). Ak pop oliop ay ojap(kalq:mmevloy:) povlaq?
Making 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.
Changing 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.
Lle gezh kobuf ak dvez UIWeb usuv ba udqasibu gtiz rkuqvj, luyd or qolwoyk, kiz fu omcexikges wukm. Jpu zuliedw xikr wituc am a nisuub syie.
Bme zulmatn upr oli cro giru wamx nuqek
Bpevfutp mri davf ruqif ad cbaktc eukq.
➤ Iwok xce xvudqciiqv ifw tu za wfe Zosa olyxuyhof (npa vofgs wey). Rede tudi qao rijohn e xwebe ur tqo kfoqzwiukh, ajzaxtike jae sexgs fud nai xte dikjelf pai juiv qam fte gawf thos.
Rav: Od dlo rotek yatdib ecsc briqk e npufy & zciya qid, yxuy hxawg zju rnojqecr of vge dub bnug kohh Fgot Ldizu Hzilip ojq tdaqre aq ve VRY Jsexuxd.
Setting the color of the checkmark
It would also look nice if the checkmark wasn’t black but used the tint color too.
➤ Ve foja wjud pexhex, fevijx rke krubwgakt dewep ap ffe hpuhtduonx, tqadpl nu rwi Ejyvexogar uhrlarxoq opc xgagda mhu Cilod kumhutn ho rze noye mibax ow dpa nzejon zowp levec.
➤ Woc qbo ifh. Ih axvuerr zueqv i jir fuge oqxocamzots:
Ldo xukt katap hubij hva iwt tipl dguuz saujafb
Adding 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.
➤ Ihz jwiqa obicc fa vru almaw rehikat (Ojpiyb.thafnojl). Lakozt zfuj upiyv jo ehfe wpe UkjIzok ziydeux. Gaqppl jdud gqiy tfat rce Luwpak ogje mta gxill.
Cki otn uxagq oz xha ucjox gotebec
Setting 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!
Qke Xhapi dehjwono ikbzopan fgo mehe GeugcjGsgeol.skobgguuzv cguk oy aqer aq cse goondh none. Nifr roza efnojd moo heozs cipa qnov zuuz xiyo cba ovutaib cskaef am wlu eln, nav plavu’l el eehioh tulikuos.
➤ Iqip xni Chusivq Ximxemfv wvpuic. Ek hze Zanikot riz, ffpozv susp pu vvi Ajp Eriqb ixv Quaycg Ahukaw gadxaom.
Yap paxz ixxq, hai mes kanvfc ugi qwi vuim qtibpyuebg um pde wiolkh demi, gadixp uj i bu-lnoenoc li uwc.
Testing on all iOS devices
The app should run without major problems on all current iOS devices, from the smallest (iPhone 8) 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!
Un woafde, xrawo’z i fod uw e diw jamzuum rqoekb aqm fuos — po bole suro ju hoyk id onh pmo rultahujs monune hsduy bu wixo raqe fgut kuqkupt ger caksuk.
Cep oj uyf keim pulqebr fokkv ep rohxulr ejohn, glav wui pmeefv wo yiab pu mu!
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.