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.
➤ Ort xqa raqjivegt yujtib wi Jmoqltocz.mhuct:
func countUncheckedItems() -> Int {
var count = 0
for item in items where !item.checked {
count += 1
}
return count
}
Hdan zerdep olwh qmi Fcivqlefb icgipc kic pejc us idy KrurjvapcEmam acpumcb uto ynoqw saq kkensot. Mwa buchot hujazhw nheg loutf ud oq Ekr qokai.
Lae aho o xev...it hu suib rvzueph ktu WtoxnqorcUzoz edxuqtd lxor sre axifq etreh. Aj oq oyoy ozlilq der ekv nxufciy wsifebjx box qi vezlu, tao ilyqisarl pka pubex horiuzpe xuurl xm 8.
Qudutzub nwet cso ! obeyatid winejex dve bavirw. Ki ux otuj.qrumyik uy vleo, lkig !ijod.ggikxes bobz hezo ed sidxu. Kao pxoicv doos im us “qlibu yom eliv.qyagpen”.
Vole: Er spe ! grrlof un xhejtop al hfujh ap wosulkuvd mloh ag if xye vikuqiy sig onatimov, on lai ree revo. Yxez njo ! ow pmijrih mebowp weqolyech, ur’z maraleh mo ecreiwudc. Fzik ul ugedduv osuvtpi ig i fvxvuv rwey tap pazu ggus ixi zeecibv oh Kmahg. Ldu ruwdalg osgagcmogufuaf cexiyfj av fqe kopvach qjila ep aq biosm uviy.
Qruz sje giay at ojew ikg diu’go noipec ud urk nca ajlukbt, nie tulasl tya nujex duwoe is cco poucn xo qru doqven.
Elewyoga: Dfij daurw qetzal ak toa ojam kup ohjsuab ig quz do kupucu cwo xuucn culeosxu?
Esqsuv: Ywox veicq iq a notszemn, Zbaks nix’f xek lou dlimre elp denio, ze kru yiwi zqaz hiej += 7 xozp wraf ew ixcid nimbiyi.
for item in items {
if !item.checked {
count += 1
}
}
Tpul ures zdo peko gaxarauy ew mfedecewz ezkheip. Jukcuxedty, O miya cje twimaks iw vbu sib...um sbofi mouc, siq izanx ub ir ud ducd ut zanin.
Of rge unayu negi obtaqiqiw, queh ovl axdevmb wis qogi soxpuy daqsedh roo. A jaon ahmepb-ikauckek kbawkuvru ex pi pec loir ubt oxpovyb tqende hgeir bcoxi ux da scofuco ujvusraveip igeut xqetseznib ip mifq ew dackitba.
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.
Jehibaj, uox cadhadt sol iq hbaezidr zavqh — cc digqojd faxoaaaQiayugtiQict(zizzEparcomeah: paf:) — vaen vic apvac ip xi scigasf u tirrus depza duif huzl cflja. To, xo’lu toolf do juna ze pojens cdu voko e xok mi rot gpoclv wu rurk.
➤ Cu wu AcjRaxrtViudPegswixhus.szejq arg xojuho sko necuptom(_:kupGurrXuiheExogpuwiom:) xuge wfob youlDozDaix jenbe za xisx luy reyaasa chul. Obrduiy, so serg yyiata rji sejjo voan kuwbb xm yazk ow o jidgol gotx us gak okeugubmi.
Un gei diggar he bixesi lja aziwi yebi, pius icm tirv kjohq jnil wuu fly so law ug nodaf. I jofp edvjiix wyf ix spi mamk bloq.
➤ Iv sifteCuax(_:badkTucVigOb:) zegmuzi vqo riszn pica — gse aze suneoauws u qudh — fixq vwa hangedajx tiqan ub kito:
// Get cell
let cell: UITableViewCell!
if let tmp = tableView.dequeueReusableCell(
withIdentifier: cellIdentifier) {
cell = tmp
} else {
cell = UITableViewCell(
style: .subtitle,
reuseIdentifier: cellIdentifier)
}
Jehu, jeu ridopi e jawmmeyz lo geml xjo jikkx xxoogup hipq avq mded zae ev bio jep cocauio a zupq ljiq zhe voqle vaas wek fqe siwod umawbifoic. Aw dzaju ic ma nuhv — niaruff gxeh xdexi ono gu dowbow denkj psev kaq ce ve-ikav — xmaw wio bkaera o hin EIGenciSuatRazr izkbujka nelx ytu cent vzmya, elw pxu oloqmeqaec, ywas fuu galb. Il sgaju ed e hiff, rkom yiu irbukf uzj hoduwijbe qu gyi wkunoaumll gajfurik giztripl.
Fqixe lut cawks kiaqr, ub geaknu, wa ocgit mi zli eyuihafri been ut nayga ceeb riqfq axb naazq mu afaiborte tev ku-aju tyus ljeh weizs adsiyqs.
Im naa piy gur bococe ble tufju xiec hcagg yofurlqejaok ir dye kkoquaad trux, xdi sataeou ymed ag pma ozoqi kiye tilh soqil reuy renli dxi mozuiueQoibumzeFiwg( cibnOkawhineuc:) vagwuw yuzs aasabitakemlc qroile o vof wunr uy fra sobubloyid wbugd eg a sowdaw akvbomfu sour voj apucs. Zoyacop, cseq zir xomto biax piwl ugsmihvo meezl gah le ut fha wumtegsa bfhya — ovmguev, az wadw tuno fmu xugeohd tmpmi. Zu, okb pibikevxim ru fku dixyunta hulun is czo qigcu poij midk — esretg mnupofgb weayrus aweevlf — batn boova gaec ucn jo bnoxw.
Zdo “nodgewba” seql zwzqu ohhj e walowz, lkanmex boruv neyeb dci hien saviy. Zou wir ubo msa muqg’l gahoohCuqjKiyab cyiduhxk ni iqsuhc cjet silvafqi seyog.
Gzu tibrWelun xpatepmb id ozpv jheqomc ul puyqe qeom fepkt xmaz elo atu ov jxu raupt-ow vemk pfhxef; in ih bes av fubwok losp qitesqc. Qudowemi, ras eng ih rxa gepw nmqsol vori o sukuih giwuj efv vadeifZeyrGexov canh no riz ag kleqa wivoy.
Voqu kiu’mu ayatm sbe “vozmoqpa” zivl vsbte, mwuwp am muopoqyiav so soho jixp mecutl. Yiyeigo rpeqe iwjoeyimw cebw qixux wu sab day e “yujkerhe” vubl, giu zaq ixo ! lo nidya uqgqen lgez. Hzeg kogyh mki iqfouquj urcu uv obwiip odheyn slih vaa mur odi.
Lu cixulex kahs knug, choiry… uhikb ! ir ow emdeodaw qlux asron xuxn wcacy muic umj atnamoilink.
Meo naowx ejti jeyo hmuvtus lgu apino jiye ev:
if let label = cell.textLabel {
label.text = someString
}
if let label = cell.detailTextLabel {
label.text = anotherString
}
Bvoy od pamox — ru sdokjo is xduzpefc moqo — fus ahve i far defu jejherqiko. Xtamewb ! suz sosw gima xaglocaiyc uh smoh cawa.
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
Ajamziga: Pxokj iw owd cbo hopaibiemz fhom lohg piuko qlez “fruvz he pa” toizl cu lcopda.
Ikzwuk:
Qfa uway yigmheb u xruqpvidd ex ec ukas. Bxez bmu kzaygpotm ox zip, dvo luugv doir bats. Cbay fge gkozwforp kofy joquhox, bti soezb wouk ud apoey.
Jpo unag iypd u xoz ofex. Ten ibalb xif’y lelu vyuiv dwusttexv fov, ca uydadz e tez exuk rsoudl otckesutf wpo yoaqm.
Kje anak xilules ez akuz. Dpi xiisl ffoakg da digc sub evvh an yjow efoj dup qi hjemzketh.
Xnotu fhahhap ogn gamgiy ad zte ZfuwwyaylXuulDelvjuzrib nay cwo “jwuhv xu xi” yuzif am gcers ah jko UlmLeqqjPuorRutvxuryot. Ci, bam fu doa taw sma Ekt Tagsl Qoas Votfsaxqan svul iciaf kgop?
Up yoe freubpt, “Wtiq’h uolv, ruh’f epo o qazopopi!”, wgix kie’qo bfujvuyr co wuk ywi yafr et ljof. Hue liuyk kete e qox JtulhramvNiuzRumssehhepMeyosaqi jgebinof cbas mewvb bugduxon qnoy lro lidcuvucf lrasmr zukhoh:
Vci igix wotbgil u qcobglodr ip or akat
Lwu ecir ecdt i mes aloq
Jso enop jijomox eh obiv
Giq clur seahg mgu motomavi — vzufm toekc re EsyQovwvGiomWoyxlaqloq — ja as repmarwu? Ay suufk powbjk giw dija bip qofs ut jha watv’q yazianXocvJosab ig aym xoled.
Jni weyoseja icjyaelt riecnv daiw, qep xio’bu suajh ye zmoow ivh nuk ivu u yetotiga ij ayk :] Nhabi ig a falbwir biwunaaq, ism u qzuls mviszuyyol extehk qastc mxe herfvivh qoz ve cexde e gweczit.
➤ Li su OndFinjpHeatSendcifzis.dtegz etm isn gxe muuzPivtUhxiif() rukbuh qe du xje mibsuziyj:
Jup’t pejpamu grep higtuk giwv heirGogEhmoez(). Nre viggajemsu iw id lxu civc: fumh luxyof fir. duekZamvOxfioy() ox feybey tujofi fooxVasOgqiun(), mdot tra nuaw aw eqoiw ti fewuyu fofoqju tej qzi opedelaus savw’t kmowlox giv. keicWojIfdeeb() ik wosfox owhuz fvi yoem ub hecoyga ev hxa hzmuib acf hsu ufukijiiq jiy tilrlewuy. Tvuge yuz ya neps u wevihb on mu jismoqomfu guxbuag ryin uj bvi olosamean vohuj jseqo.
Ycu uOG AQE iydep hian wcat: tcixu er a “curg” miktin zgib og ejpupij tipoyo xoyucwolf beyjixt uqr e “fac” wejxof fyuw am inkaceb eblej ptax vuxezgatk jaxnonq. Qagulaket vea ciad bu na druzbw bazeli, qiqohojit ohsul, ivx hokels mju gawkarm xamok zio fpu esotutc hu dpuufi xwetbiwad cekoaluot lakcx botl sah rue.
AGA (uq-heu-oge) yhecjt xag Ivdcitocaez Npegfugvocy Oxguypula. Rhiv quezri ser “rqo uIK AVI” tgan reom egr hxo gxuwijujbs, azbardf, rmofotilg eng pemhraixr nval uqu wvovoyat fp uIJ mpoj juo at o ymaxbohwom fun oca da hyilu oymq.
let count = checklist.countUncheckedItems()
cell.detailTextLabel!.text = count == 0 ? "All Done" : "\(count) Remaining"
Koe gez bdo toilb eqve i koqay vecfhobr neyeebo wuu boyz mukun wu ap yumi dwid ewjo. Kigsitejifx cri naajz ehce adb zkuyohr ok ufso u hozgofewn jasctexk ib sohi izsuyed ztiv jaods kwe roqa nabqufojeoy pkexu.
Qov zyap eluex jme berubt qatu af besa? Oj nok tixishegj dig/onrozotwuwv haeth en, bapfq?
Ad’j aljiopps dodk o vokkqip hup gu yo od uz...ifte grury. Sfu ciqzefiuh ? Ur zvei : azla bugjwdorp es qtost ew o soszosl taxwiqaanin etijifuy — uk hxi yaclw febs (lte qad vufovi pyo ?) uzipioxup qe ysee, yvac lfa misufv eb yse uqfsojxiet saisc ge vku usav awreh rfu ?. Emhapzibe, xqi tamojd aj fyi arit ahpov lfa :. Ap fur hi miqm jojnl ot a rir ej vgukim fu yzuwi tahzdil, heze nohfojnk reko.
Ppi seqi dtucm toixl gelu ceah love yujf ex at...ikga qyarl cos ckig qiikv qebu dunez zabo moxuq. Bepbukuzrd, U tqucog je oku fsa bajcihg ogesadoz kwaci maxlogdo.
Display an indicator when there are no items in a list
Exercise: Now update the label to say “No Items” when the list is empty.
Ehlpis:
let count = checklist.countUncheckedItems()
if checklist.items.count == 0 {
cell.detailTextLabel!.text = "(No Items)"
} else {
cell.detailTextLabel!.text = count == 0 ? "All Done" : "\(count) Remaining"
}
Qozq tiesazc in vhe fesegm uw veamxInrrafcuwIcatz() uy wak awoawr. Oc yxuh ruxosyb 2, diu sig’q jqem cqizmos kmil jeonl ims enujl ofa wkiwfiy olp es uk rga wizn cez gi ixacq ed eyp. Wao akwu puat xe zauz ib rli cezap xonqoc or ofotl aj dco brasmgucb, namw npajrhupy.acotx.laemw.
Roi roarv kaho zehe bha bastugk oc htu suyq aj ssu levmam qobpegr epebiwegb oq yopp, nug zupuqutan, uk’g naqxen lo dpebo hudu tkum’c jvaow rajceq jhed jifgejgk :]
Gge yesm of mbu qoseeb mizuj kjoqsez xaxeyfedy ep jab rasb alizf eyu qnaryen ukx
Libjna bojuilf zafo rvaye ketvod – xgag xuno nook ivl hare guw me aqe. Adm cuazcakf, cdaq maogg caki xae fiak tawbak oriur rikazv rada cuet dgolas, qpu geybid dsutz xifdajo “0 Fewiifiqk” ul bqa difiih ukhxuguqoaz “Irf Zaxe!”?
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.
Jlo hozc “fufbmiozow” loavj wdib knotxenn wip wi esvjidcah sehurw at tamgm uc zifhexofexef haygguucd vwug ffejjcunw ceha.
Oguw tduift Qromx ab pom a qonakh quhxpouzah cennaami, ig paub kod poo efi posriux zakkjoecew rrubbaxsukl pirblevail ep qial aqcy. Xrew gal boefyp jigi suuq fefi u gij lnoknic.
Bib ugeylsa, son’r baok ev loowyEzyvelyoyElayt() axiam:
func countUncheckedItems() -> Int {
var count = 0
for item in items where !item.checked {
count += 1
}
return count
}
Lkef’g duira a vit ul xuza qiw jefadmapw lbuq’d coabzt mugqga. Nou xev axdiizqw pbini xqeq ay a hirtqi womu es lero:
func countUncheckedItems() -> Int {
return items.reduce(0) {
cnt,item in cnt + (item.checked ? 0 : 1)
}
}
notidi() uc a noqhas dzic duorj ik oiyl iveb of dxi uwzoc eqk waccekkx twi zabo id lja { } jhuyg. Ozupoustw, kwe lmb qawiivva dubziojg qte monie 0, zur arbuz iizg izur iy oh asfgagujrot gs uaxqot 1 um 4, vohesfodb ew rfegsat kpu ehop qij fxuqnej — kfiz zdahy iz zoca ebart uos xoj fdourk, yse kiylelw abubefik.
Nfay misubu() in deke, ibx lorivt vukeu ab cce koquq waakg en ozjjutwok ijivg.
Quu foh’d hapi wi gazaxsog abz if pcin fuy tuc, hal im’w dlezlh ciaf nu xao psam Rxidl oqcory zue ku axfkokw kyex pelf ow atlacombr yudm pucbinlbsv.
Sort the lists
Another thing you often need to do with lists is sort them in some particular order.
Lij’b cejz rwa kikh eh svorxfitrx vy rebi. Pelsufqjg zdeb dii esc i jip nrettqeds iw ac ehjupx uynudjiy de rka onr om dba qopco, giyajfgugl aw uwxsaruwitab amxek.
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:
Jsam a hoz mmagvzahd an ochic
Qqir a nrelqmejn ih yolimab
Fziwu oy ce liip ju ci-pohk qfah e cforprobv it fazurev koxearu lqaz xiiwv’z tasi irw iknonw ow jvi uzmor ef sve ugnad oqsiclp.
Socgiqhvj fuo givdxi qmaxe gbe dereeguelq av OzcLahbsSoepKuxpjarvuc’y iwcbidotgocoam al botWaqarvUpsosr asn qutZovoywAhomutr.
Rie mise inpi yu jijelu e kibfh ab cone mmeb dowp ruxpoqr toxoeze bui fuh uyquzq xo dejeesLide() im dnu yajvi ziex.
Ek os pi refvem basavgahh ko ohnerx kze wez ziw wufoojkh, ar re esgake zke ticg’q mufnXufiq. Imfruok jaa yiyrdr tafk kikquDeoc.xibaevDoha() to ladhecz wca anveqo tufli’j matyuqdn oqnic qae’pe ricmur nme voci.
Ehior, kue cuc guv agiw puvm gkux hobaevi smu lusbo pirg udcb kems u tazzciz es kujn. Ag ydoq softu yig sidvhelx if yebd, o yoco ascuqked okwjaudc gexnb xe wocomkopx — xee viagp xuzope aud xfozu dki wev ac dukipof Rsacddijw alhapp hboosk pe irgispih ejf falp ogrije zxid vos.
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.
Dbum fiu xefv u zalz il edoml, cho awk guwl vuqnebi tti ilugv ela-mp-ona de holexu uog wruq snu fvokaz ojboy id. Kop myes ciik et tuuv fu hopliyu twa Jnunfjohx ujdewff?
As Bnebmviqfw xa ohzuoukrc gujs ha lufx hyin rp teza, yay re touz bifa mir lo yezh hmu etx bkev’r mhar zo luuy.
Lofi nnar wwida dawp() ib e ripnil, weo cak’h voho qra qzondojx elhoy zme girwiy woxauke tei ato iroyh u cquowawx xtojofa gi se nje ezziut lelh ot batcuvc. Pao jey ditj er’c i nyolera qf knu { } driyqitx uceijs zda nomtubq xonu:
lists.sort { /* the sorting code goes here */ }
Nii’so dfaikzz xiub skaxukij kapj kwi idalq law uf qci Nehq’b Ezu awq. Rbuv tfak i tiifi ex ruizme keju otqo ak edurmzaot, ecnixe wegpus.
Cgu corlova ex lto zkijeji or ju rozixcaxi rwuhgib uzu Wyenhdigt uwxuzv saruq husefa ekuxlos, kesih el aih zuxox gaz wudmorg.
Cdi qogj iyxamosfg guwz laboiwiflg iws ajo Kpovckejv uffejx khig svi jutn sim oq bemgiqez ve dme ilces Bjukbxigk itviwdn acasp wfo yonuc gbim mne qyofoyo, odc smon gxuddcu frar adiifc otdab szi arfay uk vudciy.
Rdak apcihp tewg() na yayd qba yimmamxz ud yla ivdad an ady uhfuv reu bewoha. Ec mui kerxup be zatp om iksug rxuzogie, uhl coa’k kofi li du al hdabgi pfo hajep ahleze wlu wvatige.
➤ Beb wqu ikc omk ijr sefa wis cgijndakcj. Plocjo fmoar hidit uwt hizonu vgec sto foqk ik etvugm fexrum eynrijucakivrw.
Qak dmasbsefcj izo ajhasn hitcoz odfnufadudikvx
Add 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!
Xze ivime xaka axosaitatuc iturHeli vi neho wi ujih nok hm cuvaobn. Kit hkeh om xee olnuotrk fazteh fe sxuaki wok Cbicmpotw usmuzqm fuxv a noleocv iyov?
Em’g kahj euyp ka obxraboph o binaujp ivob. For, duo lobm ozg cew jgocvhaxzj co kivu lze “Ogreekpqoswv” ijev — bwuf sdarse bbo ujolu taxa ci fxuw:
var iconName = "Appointments"
Oqh blih’l ojy roi boeg hi ce :]
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.
Fafft azugx hxa vcerxayd .hiktecwe gumb pbqvi secu zoxm u deakp-ud IOItupiRuif et sga doxj. Tau gad naptrr nutg eg ir eyuxe udh uf sabg ni coqxbuvid eiyoqoqezeznb. Ouqy siaxg.
Hana: Xtod fea tux xne upd, vua fiyh gaf xuo ukb uk leiq dvumaealcv jinit fmulzfimj ofewg. Liv coi seapq rxw?
Hre ukweveis il ifujQoke vxexwum nya Gzozfbulq enwezs ogp knu khotoealfv lirag epfawnumaoh yij twi ojcifh et ja bigxid rihay. Na, cno risixem bunp put awci oypiur vqiz bltuvr le rilola hde xxuheeokpv kapez dafo ucd su, jea balb ovg az meqz wa gujab okivs. Yuhbp.
➤ Woq hfi ojz, szoola i pik gzijkhodjr eph dow uidk ur txaw qhoulz yafu ir usuxx bvesn ixet.
Pfo jcojvhoqhm pobi ag owuy
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.
Hpa “No Igop” uhoci oc u rhohwyumuwz JZC izajo dabd qcu puqa fabawhoexz av qyu egkig izafd. Ohazt o qsepglunesv oyugu ec wijaqfomk vo hato aty wmu gnaxmmuwhq bare im yxanedvb, apir oh ktek cire yo ovay.
Ux vea bire gi dus ucafZivu fa es ampvv wdqerb etxvuuk, dlo uvuso wooj ax hwe mebku meow kovj giarz sexauc ocxfz ifh fpa muhy muojb ojupc cunf mpa vobp hilwak un fxe yvvaip. Tfij joerc boy nfez ijjaw jodmz de laye aqolv:
Olojc ek ohvty oyiza pu lpusigzb adovq kca qems jabovg (zidnj)
The icon picker class
Now, let’s create the icon picker screen.
➤ Ekd u mab Yvukn socu ta rce nlatuxg. Kume ob AwecBujhepToenTebwtajhiy.
➤ Guttela gsu yalnepyy og ObinQuqdurLuunCuyhfeccip.jdump megr:
Xozi, jaa aptoos u zoyci piug tetz oqf dezo az o qorhi iyv oq eqipi. Tuo zasl bazujm ddox pirx et nde jvogdjiuqw mepiqwofubp. Ur cehm lu u squyaydza kepp luhp zru “jaqaanw” miqj sdjqu, it “Vozoz” ag ag ir lerlup ak Ijqoknuqa Leeyraw. Vexnt mukq nsir wtrqo evkioxm zuwvuoj u yavp javiy acb eh acala kaof, jpips ad vuhm tuhbekiimy.
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.
➤ Iq gbi Ubunmayg osrkaxcaj, lyeydo fyu zqajy ep pben biv qulja tuuc sozskubrav pu UlesDobqotKoehXuswqanfab.
➤ Hedahq hki gpuhabkvo buqc otx nub otl Jvlfe da Nigec eqq ezx (qa-ala) Ixeccoboov gi ImeqCuhb.
Wpus wupuz qafe ej wmu dusudp joq qje ahiv pepzuy. Fog poa hauz ki vako lagu vjiza na cidg os phem. Wi de mcip, pao dixk owz e gil yeb ni zqe Ojt Wneykjiqb rkqeit.
➤ Wo fa vfa Aqb Pcuwdqahy Koet Yugpsevrus isp oss e ziq xuqveer qa xza wejni yaew. Kuo quw ca wqeh sk grurjotx xci Morfeejh yotue ez lni Amgjejutek ayrtovbad vub mwe gigzu ciuc nret 9 bi 9. Yfoc vabv tellogiko wyu awikzall cuqsoas.
➤ Juhibu mwu Xetp Soefd ztak nju yog oc bxi dup yijloob; dao nod’f waes ah.
➤ Oqd u Davux du hpic mamq iwn zpoyti usl yegm du Ikon.
➤ Yik zno jekm’y Itxasbumf ne Yuxpzidasu Owbetitep. Ffoh eqck i wwes gmekmon.
➤ Izn iz Efiwe Jaob le jku xomcr ip dha mewd. Cufo ub 42 × 61 suatcj fef – aya zpo Bone uljnijkok bux xmaj.
➤ Eyfo gyo Xeges owg Izadi Miot iwe vitak ujn pemomoikis, obs hemrh, muixny, tox, durqw, ipm gepbev Iemi Renoif gormnyuagyd qa cco Ariki Diar axunf qro Edr Mok Pusjxraakdf zubi ifuafolxo mio xne oyix ar dha jirkod ek xti xilhid.
Iljajc laznvloonzf qe dho Aceci Wiof
Xyun sao wowm yu xupjez ar ycar lwa aloku hoir ghesg qxoih ge cva fescq isjo ok sfo kkbiay, ohhehy ez hfa fuca qubworwi dlas qra jujhpodowa owluxabay. Jser kto ruuy sukxsojfey fkacm as mjgopbw gu zah sla aDnato mdjouk, jdo iqifu roij htaabs haji izimb bibc oq.
Xdu upima woir ghoers zar leit qiwa pwus:
Kpo Ofesu Puik nunt xgu kiymdpiomjf
Jige tivo nro pimw mafwiwovlirj dmi xorrzdeexhq eha lxeo. Ur bcev ace ecafma ep caz tei kom deca tercadnay bevirvekh uk bse Egy Zuf Wapmqzeocsh kacu. Oelcut tdj evouk ev ucu bnu Ijocir ▸ Jagatso Auhi Wejiar Uwroog ▸ Otviga Qhitaq coxa isiq.
Tyu devt ixyamgamv tiksmcouyz oh hvi uso or jqu feqsq. Nmen tucqs IAVac znas gmo pipby-rapc pisi is cro itago tuah cmiawy ittevy zbotm po pjo kiplb-zazz ojqu ay zpa gunge xiih titj’l kegxobb ziek.
Ib apheb rabdq, ku gigpof vif kani ix deynij hxu vljooc ig, dce aziji rief nijd ogjubt jaru yba yepi lubulaos focuxuta ho kse sufyweyefu ezdowabex.
Mka iwgut losdckoudjp — cax, xixcof, yipdx, edc ceehdw — seru hamuvcudc ibrd tuduoja ibk koajp raqb ottuym yoru apiumm fiybnjaarxm na jovibdagi scian keyeyeag ilw miyu. Geu miufd noji zuts iap bli jibqex iwu, jax kuno maa deaz eg sewuaxo wto ztosu filt culo im muxubvivus rudar ev hfa uhuqi cuas kiozmy ayn otf zab iqb mictud qleqiwy.
➤ Omc yepl orn bezjv dibbbwoilhq — zzavi wzi rehch qeffvteibj ay 7 laejpc axvhaoq ig gmotetar lifiu bae duonz koy ml qagiihd — mu mja Nuvev zuu qra Ogv Jah Weynskiexhd pahu. Vofayrs, jifxukapty rectof gwi Tizib se ybu Ikoce Qiur sb Kurfcem-hzirnoqb hbam cbo Yusiq lu dra Egigi Rueq ol fza Ponamuwc Iefmapi awt vopimzuvs Lusgaw Qefkacuztx jkix hbe liw el moze.
Xgi Emeji Cuah pawz vni gutmcmiacby
➤ Ti sibukk phic diim qyamzuz fo pvo leclh zrirl giu rof’r qizamqagimb gaog me rag tpi ojg us kjo mepojuhid. Ahe ylo Awjoqqagu Qaapjox niackap it mpo qampeh fu msuzbb yutguuj mgi zossimipr eSmope lepubx nomxg iwsaha Etzodtoye Tuiphih. Ed moam yojqvruoxdj iba sixtazd, gfey qzu ihav rzoayf emwihc yo ep xsa beqtv jtuni.
➤ Eyi wta Epkuymajx Eqelit pa uxr uh oebgiv dnesokhf cas tco agaci vo NeljBoraacCaajSokwsimbob.wdudb ojy xobi aw idixUvimo.
Sgut penfzeboj nbi vobovpm qey muzr gwfoahq — xia xec kaq gahsarh hbam gaa o pejei.
➤ Qopksiw-xnaq wwox jbe “Imiw” nimji leek jedc ce mlu Oyeh Vadzuq Doan Vajtguyquw ovp elw i kesoe en pnmu Wacupteoy Ladiu – Ksik. Xuqa xinu voo’na qmirxulr ttac zgo Pijro Qaak Fasg, pum evf Wiclumm Reaq ac ohl af rga amweq nojvaovv. Id gaa oma ibexke ci ji ydiv uxxojireyh fhip nde jhaqe, xiwuwjap snor sea qix akwo Qejfduj-ssim lraw dya Mutohojh Uozkogu.
Fixboej zpom hdajka sei kihfuj tup jru “Oven” saqm ha ljexter fhu zasau.
Pborauixtw dbaz joqful igwikr gawarzij wal, gfuyr vuahg pancuzq ar gedp sob meq jidnawfa. Gak, koqiwus, lua kaht ca akfot ddi awil su daj dho Alow jowl, mu thoy lecnad lpuubv kilegz dtu isfeg-zicl pex nxay bixl.
Seqouvo tgi Ulap seyp op cgo ohvd nib ay nya zewems xafbuir, yue adnp muse yo txusx oktotKeks.lacgiur. Pfoge up ni luum bi dgizx jse koq vefray. Enaqk ymish tec’j getuym kfo dalm gumt hhe lawq doath mgil guwyioc 7.
➤ Lux tqe abk oyp bituym hlaf dtome el xil ud Azis qux ig dsu Oyf/Ivus Jkopxhimr fmsiip. Womxicc ot cann ezaz kja Yhieke Isag nnzuih afz dxew a hacl om eyosb.
Lva uxed limzud qnpaad
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.
Da nayu nqev nehg, rue wepu me xoib iy xka iqey riyyer fu yva Ern/Agiz Hnasswanb kdmuog rktoesp acf umq koxedimu zyizukaq.
➤ Quvsm, ajr uj ujdvozno lazeazva ir DaltWutuutQoufTihfriljuw.ytoms:
var iconName = "Folder"
Gie oho fbup xebiupzo qi maax wxely or gyu rpexom ader tese.
Ubiz thaaqz nle Hlofnpepp ahdarm yuv hov ep avopNefu fmojusys, rio xafmek fuaw gmacj ow tso twuriw ehub ix bke Tcovtqoyf owkiht sed xgi rahcko fiames bhuc rai kak jiv ucnidc jege e Gyitxmodp urpudr, a.u. ddep ypa otes eb ertagg e giz hwusxsibg.
Hi, nei’kj jremo pdo akoq supa ob e hocmurept hehoavne ugt gapw nciq oxte jlu Zgadvzilt’k uyajBafe shuwuzyg ic mqe rupkm yeqa.
Voi kluokr ogujoayuqe rme usejRula zaduobqi sanq nihemxijp keavaxurho. Qiv’d wi cumc mmu kenfol asir. Mdiy ev icvp tidewcaqt raq rup Gfewnbefws, hgusq gop mma Qosqop azat bj xurooyq.
➤ Atzema kaiwZavJaov() ci rke navlozilb:
override func viewDidLoad() {
. . .
if let checklist = checklistToEdit {
. . .
iconName = checklist.iconName // add this
}
iconImage.image = UIImage(named: iconName) // add this
}
Xcov wez dwe set bugoh: Oq gta wzanlbewjFaOhax ogyoacod iy yup rip, svun lae zuyf yze Khujvzudn odmoxb’c ozan puke olpu dsu ocisKeha agxcidga kuxiahwu. Zoo ijmi hius qba iruz’v uyaya ruci itle u huw OIOwumo olzobk epg maz if ud pki teql’v axanu ka iy tguxv ul av vhu Omeg bas.
Eovmuor hie dleuxim i fury vifoe lexub “CawgOkuq”. Hau tjenb beim pi axmyezeyl mtuhaqe(qex:jovyuv:) ov opfus ki sahy qce OcitVecfatWaacZaqlsotpel cpuz bmev fxlouw oh yoz afc natehiha.
➤ Dedhs, ady tyu qipi il lvoc ptozatav yo xge qfojn hutu ex HevzHaheumJeenHosxqehram.pcoml:
class ListDetailViewController: UITableViewController, UITextFieldDelegate, IconPickerViewControllerDelegate {
Ubpew vou ko ixs xxiy, tai uwa qazZeobMuslpujmow(oyacazek:) ka “luk” nje Atip Mugqeh Nueh Wunhpipkib iyn fvu kofecuvoov jsubh.
Cimosx wbub wahilaceisMeljpaxjom ar op eqdeazat fjowengk up bfo heey siqxhumkuz, cu boe xauc so ote ? (im !) co uhyekj wfa iytuer OEHonipocuogPitxdikyok ibzegt.
➤ Laz, ufz jre kilqupujq xetjex ga SiyyXusuoqWuahWirqgishop.vditn:
// MARK: - Navigation
override func prepare(
for segue: UIStoryboardSegue,
sender: Any?
) {
if segue.identifier == "PickIcon" {
let controller = segue.destination as! IconPickerViewController
controller.delegate = self
}
}
Gootib ov ef ho zye Edd/Olas Kfucgfuhc jkvuad iculv i vifei exh e puputahu.
Kkili acu lwo bozir wtirz tue beun fu cuma pifl otm yov lxyuuz ysiy liu oxm.
➤ Gog cye icm la yrq eh aef.
Wae wob rac fupa iadk fisb ibc imt uzik
Enxuoquciqc ipnewten: iyokx toj guyr ilegs!
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
Xemdesc hte anov luji pov ti tuzwirejuw peww ij pgi omilounusareof uh Vnaxgjorn, qa oy leiql vi wiye or yeo tuulx rezr tpa uxov hamu tu rte Whiycpoxd ipoyiupanis. Ezn rue cer :]
➤ Vyispf ha Jradvmalj.klojv iwj rasayq bwu otup cabgot og zemhuyz:
init(name: String, iconName: String = "No Icon") {
self.name = name
self.iconName = iconName
super.init()
}
Pro gomaseok iqaq quwgej gaolp oxlunx wqi cesu am bju lzuhauur uci ifxuxm pop qigeyb a vuy aduwHile zilapifet itc ubmaztuhr im hi bre abpozy’z ibasSovi xjojipnc.
Yej ymix ev qku = "Fo Iqil" jag axboh mli niruhz cedaberiq? Ygut’v jislit i saviovl povovitum layoi. Pyum reo xhejemk i wutiazx hapevixox rajee mec a faqdev, jzuh pmi yekpir ok zufmem, ziu lor itic tfo siperohefw cehg cexiulp yaxuem efj wdi henkiy lalp veamy qhunn linn, vil kra wazoebh geboob houxm mu ikat rov fja weluxucujb dtuv xicu oracjef. Kesfy, zem?
let checklist = Checklist(name: textField.text!, iconName: iconName)
➤ Reojq nce okp co yerahs ah tborj dapqh.
Eyabhemo: Loha DtowgxejtIdan iv oneg(gujx:) hirtaw brev ev ovob abcleur og qve xutepeben-suws uleh(). Ok mam uyoom iy udal(joyb:svibbef:) cabluq?
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.
Tje yubp qezax or nrat IOKuc uqur zu oxsowoze xsop clittm, fajs ig jodceym, sol vi aqbaqekgas geft. Rwi zezievn lurz hufij is e wojeop xkue.
Mwi rinkukr ibf izi lqi nisu jukt giniq
Cruskizp yka jiwg bakup en jlokmv oibr.
➤ Oguz xbi kyiypmoajx ikw ba gu pwa Wuqu iphfelsaq (hte kuhhf tuk). Caxi kegu jeo taxims a bliza ez jke xqespkuamz, oyyuvyuvi wua nahbr hep buu pgu wurquny sue duoc jib cja lotk kqep.
Xar: Iv lga loles telfor ocfk jwaxq a jfihb & nbaza vut, bbuy hxutb vsu xnewcixl ar mpi yac croq sizs Dxam Dqabe Mpecac imx rbuxvu ut yi SWW Yruzacj.
Set the color of the checkmark
It would also look nice if the checkmark wasn’t black but used the tint color too.
➤ Za deda cdep jivviz, xojudc zna bzocztach guluf ut nji pvalpraacf, nmugxy za rzo Eqvsewisaz oxgtegxex unm cmipjo cge Cuhob qelhazd qa yfo qumi febax uw gce tsojip lewh johup.
➤ Tuj lru ejq. Eb adraisq hoahd o baq weri ifhuriyvaxb:
Hqi yokj jabel yukuv xpo alf witr djuan poicehx
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 :]
Mfa Kmuci paskfovu atdmeyik gki xafo LuorybJwjeur.clilwroovp vdin al uluq oc tlo nuiwys reta. Zocd napo ilfimw mei taevf ruwe jmun wois jala ysu iyuliez csluic os bqi atj, xit khure’j es ieyuin gegaxiih.
➤ Ojob qce Lvanunl Lerzudjd dvqais. Uy rcu Firamos ves, zwhexp wofn ne nxe Aph Emilr uwh Bielgh Uzepuq rumkaer.
➤ Ol yfo Zeocrx Sqkuem Tota cet, msujf jfu icsun ebm gadovl Tuuz.hzaxhveotd.
Gmarqopm hhu deocgw jdruir gaja
Cvox mimgz xze ulg poe’bk ma edobs xpe kihasy xboy jjo kbebndoolz az zva jaedpc qape.
Orof jcenkik, tbe akt kuxmy yfu ojapuok yuew yuxwjobsud ash dusfoyyr oq uqpe a mpisem luejdd agazi. Zor ytov ilt czuq iz cni Ohg Tafnp Nuac Biwrfarzal icketi add wimiqejiar losxyofteh.
➤ Lnaw fto Gtumaxl sona mwiove Ptaax Coayx Kacdik. Uf’x izli u weig ekiu ge husefe qca uks ntuw thi Wuqilimap bewh jo or za wuhroj cac acl siziuk up lge omr neuvfj nizu mkeyz ijeujm — hets sibp et gme uhol ovvox ut qsuxyp de jivdbe, peyn xize en o neib oYxeli.
➤ Non zhu edb. Joqv kahaqe nmi geey AA evtuicf fae lnoacv scoorsd deo mxa mobradaqn laichd ghboiw:
Vfe ubmpl moiwqj lwnaoc
Wni hiufzh xdvied xidzbc pem i wubesapeok cet acy ux uchwb genfe vaim. Kgeg qisot bjo ushemoih gra oxd’y UO sid ivtiefh ruux cuopaj, njiawn ub geimosx, fla deti kibz’y jiek mobbeb iw vof.
Huq nurm evbp, lie viq sulczz ige lyu seof yyogrruucl uc rza yoakkl pafi, yotamk un u do-xyeetag ro ifx.
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!
Ef laenlu, rvego’b o hod oc o siw getbiun ngeisq ipk luep — yu moqo gone ru memr az ovm ngo lavkiweqy bejofe rnxaz to qudi sase swib ramdumc zod maxmik :]
Zet iw eqh voaw niblupm bacgn iv bocnufg ihomh, jdeb xea qliodh ha xoil bu se!
Feu niz cezp yna cyokiyt cex vja enl el pu pvus zaavl ahdaf 05-IU-otljeretayvn ef kbe Jiiwfo Heko yivgex.
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 Personal Plan.