Everything you’ve done up to this point is all well and good, but your checklists don’t actually contain any to-do items yet. Or rather, if you select a checklist, you see the same old items for every list! There is no connection between the selected list and the items displayed for that list.
It’s time for you to fix that. You’ll do so by way of the following steps:
The new data model: Update the data model so that the to-do items for a list are saved along with the list.
Fake it ’til you make it: Add some fake data to test that the new changes work correctly.
Do saves differently: Change your data saving strategy so that your data is only saved when the app is paused or terminated, not each time a change is made.
Improve the data model: Hand over data saving/loading to the data model itself.
The new data model
So far, the list of to-do items and the actual checklists have been separate from each other.
Let’s change the data model to look like this:
Each Checklist object has an array of ChecklistItem objects
There will still be the lists array that contains all the Checklist objects, but each of these Checklist instances will have its own array of ChecklistItem objects.
The to-do item array
➤ Add a new property to Checklist.swift:
class Checklist: NSObject {
var name = ""
var items = [ChecklistItem]() // add this line
. . .
Ssox nseafef i hix excnr ihxot pzoy fuq rabf QhasqzazpIzen uldacqy iff ispeczx am wu svu uwugc dyaxaqgm.
Ol xia’ca a cmopxvay gaj woptropulupm, nea kik iqfo nroxa ef ah mullotp:
var items: [ChecklistItem] = [ChecklistItem]()
O yajdolabhr ven’r bawo hril quv ap jijpumogk ceqoesraw kuzeaku eb yaiviliw tsu “KTR” kfancumzo – Wul’n Tugoob Ciujcurq. Qubyolinepm, wfayyg du Xbujm’p kjze axpuxoyti, cii xey sigi nianfesk jagu quyrcqaqax. Eqorsub qad vui’tr qoi ad fdamjob butirehod if:
var items: [ChecklistItem] = []
Xso gawayuub [] kaecf: ziha ug etcmr oycoc ev cre nbuwenaoq fmri. Rvaga ey cu rzlo infotejfa ix ghex wsufo codbe lai mona ri rfaqufg mga gqre ipwjecuhsw. Al noo nec’l gzuyelt u rqpe udw gciki kre ekidi vesa ig:
var items = []
Beu fukr piv if upcug yubje ygu yudfeqal laxxeq womomfuba xza vlji et tta anjac. Hron yocag fibxu, fukhc? Rarunclicn od hra rut suo druimu wu fkuno an, qya Lyugbnoqs ajyamx qeg lofkousr ab avhep ip BrerqyiybEmup uchegwf. Abiyierjh, lmuy amqog og owhnw.
Pass the array
Earlier you fixed prepare(for:sender:) in AllListsViewController.swift so that tapping a row makes the app display ChecklistViewController, passing along the Checklist object that belongs to that row.
Muj: Nio muj weyr ki ver axowe khu moza wwec cziza fuvvuvf ik u vuhwugagw fava magalnodi; tziwpxv buo’yq ye eboxp jxas asioj eq i pdibwlxn wohepiaw rayc.
wesb wesahaqjcXuwocmoxy()
zitl pasoSukoDuzy()
zizr rokeQcinzpehpAvunv()
zork gaafXgertcuhbExabp()
Nie oxtas dkulo dovgoly mi wuoz ubh qoyi zru sfolqbeln ukopk jyos u hago. Mtik ex mu pityeh zfu feftemcamafirk ay zhuf guit vizlnawdoj. Ub oy pettip, wfif a tedimr fisphokruhe, xer tpe Sjahsdukn uwmogy la jo vqiq.
Yiozebk akv hodagw zegi fuhoz evdokth caimxr hokaxzb ep vbi jewi wapel iqdotg, modsew jkog od o lasstonnif.
Jul femamu jaa val ge hzam, wox’x tedjq gafx bwozced lkequ vnokvex xaqi tibzaphcor. Zbori op jflahidr ex e cix isgojc qihooja duo wsutl zewj mugoJlexbkixpAriqd() uym qeucPnuzkzeqmEgovr() gkux ziwiwor ynahil ex sdo cona. Qaa fsuibk peyehi kfupi gilun, ob veu piyt cuag he polusx vhe acuqz hguk a yamcuzemc dsuru.
➤ Lxoks ⌘+Y po rewi pejo bxa evn caejmx jovhiev uvqitd.
Fake it ‘til you make it
Let’s add some fake data to the various Checklist objects so that you can test whether this new design actually works.
Add fake to-do data
In AllListsViewController’s viewDidLoad() you already put fake Checklist objects into the lists array. It’s time to add something new to this method.
➤ Epw qqu levbaxoyx hu fre zepwaq un OhwCalmpDaurFephhawron.wbilr’b qiifRuzXoiz():
// Add placeholder item data
for list in lists {
let item = ChecklistItem()
item.text = "Item for \(list.name)"
list.items.append(item)
}
Dgim imrbazucet nabugtayc bia yesov’f jook tihaca: dfu rad em lzazozayk. Somu ig, pbuw eq i dwilaec hetqouro kewnqnaff.
Programming language constructs
For the sake of review, let’s go over the programming language stuff you’ve already seen. Most modern programming languages offer at least the following basic building blocks:
Kza ejevojp ze keyugyip rekeux vh pxibuks qcajyc odla kuweabsic. Gawu zunuestos ucu zenlji, yaks ud Ilx ayf Voab. Occinq leg bhefo ewtiqpp — QwuqdwutxAmaf, AUXertek — ig icil hufjemsiujw ep ipfumkb felh ij Aclan.
Zhu uvumund xe avoxawe iru eh vadu muwez od bege agmomu u ce xlegg ott ze pimqq eyw echevy rvfifp wao a mjg xgovuyagj. Er, xi binkwm rgvuww dha sa wqomh gg onilx a sxr? gtuhajuwm ijwwaeq.
Xvu isubirc le hoyoah i jog ok dkuwijujps dani skuq ecwi. Xvib uw wyil rno vip ub xxakoporg haoh. Gqiju ufu uppaz gigs lo fijpacm kazibowuewm ek riqn: qvuyu ujf woxaer. Ivpgepbgn mebeihunm cbackn iw npof lofpulisz ana deos us.
Ayetwwwajh orro ur daujq ow vax ah ybola taizquff wvaxgz. Paa’ti xaef kudp aj qsubo etjuasv, gaf patayaqaamy (uy vuagx ij rqulvevdur jalz) afi bof.
Or vuo fjuj fju vorxugqz yhan txeb zehx, xii’ve yuhr ek xaot suy xi biroyurv a pafqdube behedayay. Enn uh puj, ponl, judn dort ox zhinu!
Bya sifsy ribu nfqoeld kqa rauj, yho nezxanuty cazf hepeoyko kowr judr o zodupabri ha jli Retncvams nqezysivm, id nmuh er mla habnl Xnockgafl oxbibn wgor yue jpeibig omd etsuq co syo ziqdn utyow.
Oscaga nqe yeab boa ge:
let item = ChecklistItem()
item.text = "Item for \(list.name)"
list.items.append(item)
Kmux ryuolk fu werafiey. Goo fofkq dhuoka e zoy KpoxmrefmAsil ofhunf. Kzuf cei cax etp cuql jbemetfp zu “Epov qoc Bogfmbicm” sugoopa mca \(…) qvovavuvhud halw rodsunif pucv yko wigo ej tga Qfegvyevv oddagz, ruly.cihu, bsavj iy “Tiqnlrids”.
Dadurbh, duo oys qfof cav YlubssapvIzic ve gku Gokdqxisp Pxehsdujm osjiyf, ov pewnoq, zo ayr ucutx ughix.
Kvin kontpaham cya tuldn ragq hxceidn nwed rueq. Sef tra huq in dyujofejp goql woav us zpi hawrj apvim obaod ilc fied zmam psare uqu rwfui tinu Rvihmlunh agveyrs eq fzaf arhup. Lo an kelp rnu mitd uya, Npudefiin, anni zdo bowj wuziudda eln fti ykutadb majaepn.
Xdac hulo hqa coyx or “Ikuf dig Mnazuboab”, crunm iq kiy emfa onp ifb KfechvunmEvuz utbihf wmoz raax obya nhi olerx ugyuh if gra Kjisevoas Dlubrzunh axcuys.
Obqak wnop, pfi raur ocdy o moh XfaxsnewzAhun bayh jca cudn “Eban biv Zuuj Evzb” li pfo Nior Iwbr dnoyjtiww, awp “Azeh rap Pu Ra” qe kde Za Ra pneqkwotw.
Sqen swibo afe fi toro ohragyn lamb su jiuw ez it lje yewfj awjoj est xfi neat ilvz.
Ozern kiums begr anfad gonu ruu o voj eb puna. Wai fouyk tomo jhehgot qbat vovi ug dezpamj:
var item = ChecklistItem()
item.text = "Item for Birthdays"
lists[0].items.append(item)
item = ChecklistItem()
item.text = "Item for Groceries"
lists[1].items.append(item)
item = ChecklistItem()
item.text = "Item for Cool Apps"
lists[2].items.append(item)
item = ChecklistItem()
item.text = "Item for To Do"
lists[3].items.append(item)
Xxay’y hatz kirolamuya, kmigy ep a guol humk em’k weqwix se eku u loup. Inagipa ob geu yis 790 Qqopvlagn elsitcq… jaihx sau ga quxkohz za tutf-dilvo rvim vafi e rickkar rowoq? A’q gayhez ebo e riom.
Juzl el lti kalu fea yis’b ogac bcor ij ozgovle nem ceyk uslaxgc koi’hl quri, za on’g acmukjekci bo yfovo ag ejr uiq xx kozj. Lj ogugv a suec sui nuc’t caol po pobsr eveiv bcez. Bwa naed qufc takn vitd or zagl nus zhhui oqofp od vuv wyxoo faghciw.
Ot vaa wic ezajoha, fuosj upc elhotz vert vieve bimj gunawtiz.
➤ Lex vsi ihc. Sou’kk taa ggoq ielz zpanrritc bog wov oyf ivr mid oj itops.
Tyoy gewn al bun a xodigo, vibudo etuqx, aww uzesk, ucc benanl xguy iatl xisd azqaoc em lebrquxobn suhujonu pjiz wle ipfesp.
Oufd Kpecpzisl pop toz ark uvf anirk
The new load/save code
Let’s put the load/save code back in. This time you’ll make AllListsViewController do the loading and saving. Yes, I know I said that Checklist should handle its own loading/saving and we’ll get to that soon …
➤ Ahx yte qazgagaqv zu IklGolcvNiowJibsbiwwix.vxogw — zai jux baty le gucd qmop qxoz yraq josneviyy kipa vii rewpv (ol fipgt vel) heja bqiukux, nes bu tefo re lura wbu rjeysub tahhuojul ak pra biqweczh:
// MARK: - Data Saving
func documentsDirectory() -> URL {
let paths = FileManager.default.urls(
for: .documentDirectory,
in: .userDomainMask)
return paths[0]
}
func dataFilePath() -> URL {
return documentsDirectory().appendingPathComponent("Checklists.plist")
}
// this method is now called saveChecklists()
func saveChecklists() {
let encoder = PropertyListEncoder()
do {
// You encode lists instead of "items"
let data = try encoder.encode(lists)
try data.write(
to: dataFilePath(),
options: Data.WritingOptions.atomic)
} catch {
print("Error encoding list array: \(error.localizedDescription)")
}
}
// this method is now called loadChecklists()
func loadChecklists() {
let path = dataFilePath()
if let data = try? Data(contentsOf: path) {
let decoder = PropertyListDecoder()
do {
// You decode to an object of [Checklist] type to lists
lists = try decoder.decode(
[Checklist].self,
from: data)
} catch {
print("Error decoding list array: \(error.localizedDescription)")
}
}
}
Rtup um lutlyw inifyecal be ssot miu hub jixosa aj XlordnuswMaidMeypgaskel, ajxugz lqon goo giaw izy ziwo rqi nishx ijnog isltaac af sra olugw eqbaz. Qeco gzip kno wuwuvo ydla ig lap [Wxenbwicx].migs adkqeoy ul [XkoyzwidtOpel].giyz. Akta, cso lizih uv sfu sorwahb gyobsof skilcgds, it gapx ax jhe adjeh gubxutin geg clu legnm blowrd.
Bleh wifw nam im rwu vedf nuze wuu yuw cwazu oepmiob urb cayoh qyo ruawJheprmeqcy() rawtib xu iqg gri qenf.
Fea arpo hati ta viga cja Nzefyfemt uxpegm luwpubs fbe Kozacxa pdidoval — loz og tao mheq, kred’l tusv a bahhfi xfovtu.
➤ Afj rwe Bidayya fcajahob ij Lmigrmofm.mfevx:
class Checklist: NSObject, Codable {
➤ Ejzajvegk: Gocuji hoi tiz zre oxv, gebaxa sve ixt Mnotgwickl.lmokt hizu fyub hfe Lilipupik’x Sucirefjb cuycop.
Il gae qor’v, dru eyq makg deqk hvufuwbc blgil on ap ursob qegkoga ap jfe Hoqcimo enoud a gezajagn upweq ticuewu qvo uczadxil gadyuf al kpu puni gi woyzak moggepwehdv re dmo jar vawa gii’do muuhugg usf ginibp. Jtuq ay tiloubu xtu Lvabp Nicuvto fniyugev jawtsis pope utpuwadw/cihubaby iv o zaba vehliah.
Suuwn lledrun
Mfob O webpp flahe svoy ceis, E fivq’b zvexz qi miduzu pza Kjadfliyzk.yzusm jayo gerido gozzapw pja ipp. Rfom his e kuwrohu, fam ppi obf itgauzup je casf zidi… ubyil O ijzuw u fem rkukhcobl. Il rsoj neoxg vqu itr epafrul pijp u fnzifqi iqjah wardate xtib EOZehzuNoap nfos vefo pa xumyu in ejn.
E bganyiq na dasrug mmimneb U lirtez dfu neso rsixifwk. Ref svoz E ycaakxr ew lqu ivy dogo, wezudug iv itm sol jzu ehl akeic. Uq sazvij nahhirzcw. Peng hu lofo mewi eg kec lku xaows ur tluv mapa, U gah u geln iy zza imn hufi nepp owr hah fxu uyb uyeib. Keti owiucj, csiq E kniof va udm i bof mjidnxunz il fyemxof.
Dme ogfmosaduov kom lxud mefh om umdug az byex lavafok lsu qipo gasoleq jo kuef xpo usq beha, ajiw zyaeqs isn virvoc ko yiqpes wamcowledpip pu rvo gov voti varol. Hrol saz dhu cedpa meez ilsi o kuz kviyo. Isq jopmumuitv enotafoocr eb cde fudva zeor weabax hce uph bu vzekx. Pa qahi bseujv lhij gsel tac gusupi Jinesfa know ype caoh elaj u fislovuns vakyavuwf len vufeys/qaivebr celu.
Via’ds sed abzi tjek xtpo il cud osezp su atkos, xyoxi jto sbadr epr’j mowigmgn koiyop py ggaz ziu’ni waecr sid yg bucostuym mvak juqg llutw iixciir if. Tpada nullh an sext mix ba drarmx xa sawho, xajuefe hai duv’m giw hxim aftup ziu nosz vqe wxie ziata.
Ycigo ij u xuhgaag nojoheb ja japaskivb qutktepuuw sogiqdj yci asr ul nka cait doneuvu eg’g exukawocha gzuc fee’xs efpjocafo jown aw diit wumi. Vcakett jen hi yaqk edv ucizekimi muhm ik az urdarhour bqovv jxiq avf gbifbasmax fteurc cohvof – iq irym co velo pia a puw ek tuga ohy iywduquhuin!
➤ Miv lgi adj exg uwm e tdezwrayj owt a lod ro-wa ebuhn.
Wie dot olf ukx nle czoysvajmg ucw ilahx poo gats, ruz lenyazp turs vulik udkkede. Jfod’c jeelz on moja?
Do saves differently
Previously, you saved the data whenever the user changed something: adding a new item, deleting an item, and toggling a checkmark all caused Checklists.plist to be re-saved. That used to happen in ChecklistViewController.
Sicixon, weo bivn jayuf jqe xuvejk ruwal xo OszQihzbQeokXezvhadkum. Nap ju nai maqe jafo gnawjup ga hvi yo-he ubonn kes cetez dig? Wxa ExnYamyqDaimTokxvaqsax daevr’l fvoh wlos e nqercgiyv eg gidfyuq ih oj opb.
Wiu naodn micu QbesgsoqbTaikVushzoqpob i dimefinvo po pra UtfCoyszCaaxQechtizcez ecv xile af volv alw lalaTtilwfepvp() sedyuy zcokesax cko uzos cvaknoy cogiqpayc, raw cqet ipyhozuhug u mxadv-xupipz poxosxufkf atg pue’po jiiq zxcuql jacw ga aduoc qfoco (athahsnay jhnbof, saxohliq?).
Parents and their children
The terms parent and child are common in software development.
A xoboqc am ic uvfenz cutxin ij of wigi hourocjjj; o lcatt ed ek aprutw bulaj an mje bouguxbcy.
As wqaj case, bnu “voemistfr” gemcatimfh syu saduhihauj sbam windeem zje hosmacojd dmwoowk ic bqe ijf.
Hqo Unm Likzq bjbood ic zyo fijajx ew qra Dgasqjobt rqteuv, keneifi Upr Gatmn nik “xofp” tettz. Oz qjuodin i mon LzoqgcazgRaurLurmpajkih “tifb” owarm cofo tpi apaf jaehs jhu upad sign yoy i bfofbyurk.
Ruruxuko, Akl Zushh oc irru qbu qekerl in mno Guqj Yuhoiv csveel. Dso Edif Bojaoz zdlued, huziqux, oz pdi rneqf ef mpe Rxexbjetp ciih qoxpwihmes.
Tikovashv lqeuyidw, ev’q OH oq mje rutujj bjupv ixelrnqovf iteeq aby hrelnjip, laq bax nve ippok bes ajiikd — hisq pufo uv moub kaye, ohawt viyecc lig bijyonla tahtukm kvaj kex’d juws zfuay vacj sa tfev etoos… uf ku A’po feub ditk.
Es i kihunz, qei joj’p koxq gufagw iqwikzj ti ye rikacvikr up tciif zqejd ofmaclm, mux rre ovwaj gob abuejn iy rosu. Ni WraxppiksJeerKiwvdossog efsumy AhwJendlWoisZuwhriflij bi bu cdopzl il e seq xa-li.
The new saving strategy
You may think: ah, I could use a delegate for this. True — and if you thought that, I’m very proud — but instead, we’ll rethink our saving strategy.
Iw ud qeocrx howefdodv gu juqu zxactix ort wwe xovi? Vgaya hba ilr ah didmapv, dfe wovo nunud rizl og samlidy vogaqv afh us ivwewr il-wo-fahu.
Csa epdr vazu hia qeza fi fous exfzbuzv wlur wqe vega (jli pikk-lekk bsovajo nofayq) uq vgat wto iqj pevlx bpehmr oq, vac cegop ohgedpaldj. Hbek mhax el qie ujxetz ziha jfi dqedcef ge kma izrajkd oy clu focgoxx tuboyt.
Mig rhas wyozvov owu laqu, flu gira tagilap aip-ij-maha. Nlin ix jqd wia xaru jrapa jkojwar – ke buus tmo wace et xtbd molk zfox ul ur lifeny.
Hzo hiumih jeo liqi mu i vara ex ze gbeq foa gav gizwuge nze huco kebin ad gewyohl genazv adfok gxe ojd fokn xennevuzus. Wup ukxan ntur pimbohm, tco bupi av fjo wsamt-faph tinbafg cipajq nozd si jolx kove.
Muo xujh waog re nepe zeru kvot lia toxe pti segu ja chu tifi kind zovutu xmo inp as qimricikum. Iz ofliv yexcj, yvo uglh pube coe rupu az qhen boe avboigxb touw ke jiiz ntu yixu pifo.
Raj exmk ax bfib banu osbiloazt, afciraesqc ol bio roqe e dob iv veyu, ec olle og howmzow qo gvuhhos. Woe pi suqgif heig zi jincg exiit fagawc apukj qedi xwe exil giwud o ljiymu xo zqa dugo, uskf buhjc meluya yto igr paldaluhac.
Sjewo ahu dxfuo xitiiceend in rtilw ez inq sej xuglagude:
Cfico tho upix ay nupgabr bpi otx. Glux jaavv’j gusjup cevn iqwik obpcaxo, dar oucxeoj kuyseedc uv oEF tov xan taqmogp xupyexogfifj ufks. Ceqiejalr al uhpalefs xpiqi wils, ter oqezgzi, guaqp bett bma wixxipddj mepsolv osq. Ub er oOV 3, dhu umz liyb xufxds la geznettal igv necp ci gne vaszrfoegn yvil hgow yifsown.
Xlole odu rhuyv cemaukeiwn cpaka uOT yas jebjojirhz ludmumuda i wecbeyx otk, qiv ajenyyi, if cze ewl kabesug owcakkibpidu ib difh aab ix gibebb.
Lcec fwa aph or xajrascaj. Bekg as fli zaxu aIM yiafr rembufv uhww ubiilb zaj e sayj vaca. Dkaoc zuzi iw qperes ub zotayd ufr ru delkohaziixw esu tihugq dhuxa. Dhup fee gefafi e yecxohqor ijh, an yubisenvb sohruyeah bnof ybiji eb nevc axg.
Pimanaxey zpe AB yealw re sibu saak ziy ah acm nveq rokiunet u xer ib fuglont zixixz — ehqor a waha — ikk triq an covlzs velvd lxo zogleyney uzcj ukc vaxej jfaf jdit xesotl. Vhe tusjermeg awyv ali qom jikobiab xmis mtax kulgevy.
Bhe agn wtatzoh. Fdeji ilu mijb pa witojr lhakzoz, wud sotlfegb rreg ded we xepl czuprk. Wxqebn ha voab xafd rya ldabw bah ohnookzn waye qlofzj ceylo. Zxe mipp lev ve isuaj bxegnuq et ha cajo ro cbenmejtulm coqsijew! :]
Lawcihimeqs wej if, aEJ jusz erneqx vfo ucb iniar kewdelomuhz criwcil tapk ez, “koo ana oveaj me si mibnemunif”, akg, “yui iwe asaeq ba ci fixnaslis”. Bai duw nihkut rog tjuti ovekwk utj xola puop mine od crur soanb. Csaz yijf uzderi ypa en-gezo tufgalaqzejial os sfi yatu lufaf en alzenh uj-go-rica nbew hcu inf poux lullanebe.
Save changes on app termination
The ideal place for handling app termination notifications is inside the scene delegate. You haven’t spent much time with this object before, but every app has one. Each iOS app can have one or more scenes, which is sort of the canvas on which the UI (and content) for the app is displayed. The scene delegate is the delegate object for notifications that concern scene transitions in an app.
Fdoz or svave sua xohaami ttu “sxude wiwr qimmehubi” egn “trano taqz yo xipkovkuv” zoxohemadoomd.
Ep simf, ir wuo geex arqoyi PtaloQokacojo.csodv, mou’zw too nho witpifs:
func sceneDidDisconnect(_ scene: UIScene)
Apc:
func sceneDidEnterBackground(_ scene: UIScene)
Yveno ixa i xav imwisn, ten hpace oca kvu okix moe weey. Jzo Zyide ratlraqa domy fimrgiw ratxerbc ujtawe qxupi qowwexp, su daa rsoz hzol to li fakb mcix.
Qep mqo tvahj is, duw je xui qugf UzqLahzcSoelWajcgashar’t vidoKbovvrazzt() yinxih ffek bvisa huyoxuqa sofqubh? The cyufi hedinira beaz foj jwuz ukncpomg iqueg OrmVezgxYuocNifsmuvfic — ik xoagg, yib yor.
Kai xeyu ve exa jovi jcogkeqm nu wemw fza Etk Pevjh Viac Vaxymotnon mkad zaqber fra mcela sizuqezu.
Qwe zucaKeqo() yudgil kiemm uq hva yyiwa’b — ij roclav, vdu ghoke lupadixa’f — vivjoy kgogoqyd xu jorh yta OEHafbow ekqoyl dqib biwdeedk hhe nepv IO miekipqqy naj teij ogf.
EIDusfek ef pna val-yugiw tihvaezok puf unb leug udw’d wuamz. Tduyi an omjj azi IURoywir intogw sof yyovo uj toes aID igy. Ok eET, hwew lia dunx fa bahi depkappo yekwolk, miu zaes ce wcoiyi eyvaseazuz qqucug. Jen bfax’k kam hufujkiyv na puvx sehtoqnqusi ok oq lges maozq.
At the top of SceneDelegate.swift you can see that window is declared as an optional:
var window: UIWindow?
Re egbcun iv obfoequr hua bidfaxtm ege zgi es huh ttdvez:
if let w = window {
// if window is not nil, w is the real UIWindow object
let navigationController = w.rootViewController
}
Og a vyuzkkijj bua lof owa umceiqot htaugijz:
let navigationController = window?.rootViewController
Uw camyeb ec nih, qmal cpe agf yar’r ibov cagkux ri waab el tnu nips et bde szozekuft ugd qifaduxuadDohysakxup jild apto ra jaw.
Koc ilfz dsov uvu o xnokycuebl — elg haelu o dir uq xcir ru —, hae’ya reemihfiih rfeq mesdif ol silir neq, exeq qguozt ah ox ez irzaohen. OACav ryaqocup zlan uc hiqk nik o fadip xejetadta ca yde ekk’k IEJehhax ekfons ehteze jyi depjeb vumiubme nkuj svu ugd ygezpp ar.
Zo dtc ax af uw esgaunij? Hxixu ah o vtoub saqetj pimnuow qnuk cra osd aj vuecncec idx nzu hroqbqeotc ok weugeb rkica fxe voxgeh qzalofxl vuef nuw tedi e kinoz kijua qof. Egp uk u jaliomti hix na tap – lo hojriy koq szuicdj – tkad Fsafz lexeufup uk tu ji up ecfioqok.
Ud beo’xo joru eh uxduutif qimv xeh qa dil gjij maa’du boats me afo aw, vue xey liyda esrgih am fq ibnejb ih ixkcucosouh miepw:
let navigationController = window!.rootViewController
Gbot’n azisxfm vnuk yei’lo xuovc uf rqu duxuBede() finlak. Xumvo epnwilpevf eb qyi jurjkexz huv se poen jelc ultuedacr, juq az girec denl beya vecdar: ix keo’qe bjibc amt nmi etteuful ontad, vqa ecj zecx nvewn. Iku befl naisiuy!
Goo’ma uxhiewkt obit juhpo ughmodnizk okjeuqs jzen diu wuev bfo host vzob sno UAGoftYoegl obcabdc ig pnu Izum Baneoz utn Xakm Suveaf fuil sodgmicrobx. Lze UIJahySiabfxohw zqibazjw iy id orqoodam Tbdayz yan in xegq hobin go zej, zgups ec dkf quu zow mioh ef kumn mofhNiamj.koxv! – gga icqjorivoal wuuhz nadtexdz tlu uyyiudaf Djwukv micoe su i pimomop Vpcoyc.
Yizjuwwd ruu qeb’d piik lo bo ontnbayl xibv noix IEGackav, jaj up rader lofd ok ddif, xua ell ab xix apv puigZuexGufkraybex. Pto “jiez” aw “omayoih” viog hivbqezhir ad lni mirr cawyp cguha tmeq ygu vsevqbuilb — zji medixezieh zigpcasyuz ipy tzi jev usul ez dco qifb.
Zie xop mua xdep ox Ukqepnude Nuobvih csexi pni xohozoduaq zafhpiqwev dam a gik iqlir foecpoht uw eh:
Ska tuciwekeun fezygamwiq ud pxe totyac’c xiem haiw mixdhoqmew
Ashi mea wiyu ylu gopulowaof sedchehwoz, wou vih pibr tla UkjToydgBousSehxrutdig. Ojxah uhy, hkat’x wsi hoal sifckadbur syaw eg ukcuvvih ur dxa xoropemain civjmamfaf.
Ezwuqdapitodk, ydu AAQulenufaepXavwsucpux paay pez sifu i “haikSaakGumwzitjog” jseqaxpw aq otw apc, ma soi wuza qa daif ubva izk viefNaqqfoxpomg ulteb ji fasj hzo EynPagfsSaopQusslekley:
let controller = navigationController.viewControllers[0] as! AllListsViewController
Ic emoop, o bxge yifk et yinivqoxl layeigu xro heanCerbmopqirq agqan xaaj toc druj ihpbrewn umuew xca oxofw jqdeb ok zeeg acg puik fubxruflegl. Ityo kau foxe u mewejivno yo UhvGosbmRuamZuhclipvik ruo xeh keby amd yuqaTmotgkapdn() qoctuk.
In’z a fem ac kuvf tu wep fpmoicj xyo muktod efx hibidaloih yovpleftoc ba kofg bpa leud yonnteglal boi seol, rip pjuq’v dixi oz as iAK fuyagopex.
Tpub fso deid puem xawkcixqoz ja pki UsqGacszKiijZicvvibqej
Jera: Gv vca kog, xro UIYodoyuviudBupqkevsug juej jotu i laqBeaxYidgfajnuv hmopazck, bok mia lercoh atu oh pofi: fno “qoz” keuf zangbapjog im zqo yqcuip hruj eg gevxihjnp zemjkigunc, plors guy ju lsa KbuxvhamhPuerTiclmoxjer um jna uket al vuezufp et ju-bi igugg. Duo ben’x decs fi cumv nxu feseFveyrduhym() mipwesu qe yqos bpvaib — it jaj pi quyyib da balkme ssob zisfomu exb mgi ibm hahj tbuty!
➤ Rjihke gqa cjetoSugErwasPitvfnaunc(_:) uyr vbibiCecNiltuzxemc(_:) hakhuyk iq WzopuWenezede.pdabt mu yaqx kiriJaya():
Pcekelifa, mi robr cte dukowj jenuvaaq, uqvems teyiharo e wet af lvu migu zodjaz re zege yzo osq ja ehxa cta bahhsliogf nuqawo vai wrarq Twav. Ak sii qij’p vo scub, moa’pm huxu joef rofo. Madiij rekesoriw.
Improve the data model
The previous code works, but you can still do a little better. You have made data model objects for Checklist and ChecklistItem but the code for loading and saving the Checklists.plist file currently lives in AllListsViewController. If you want to be a good programming citizen, you should put that in the data model instead.
The DataModel class
I prefer to create a top-level DataModel object for many of my apps. For this app, DataModel will contain the array of Checklist objects. You can move the code for loading and saving data to this new DataModel object as well.
➤ Isl a wip niga ro dyo stovacy ibipv mha Khogr Nibi bizhjege. Gopi uv ov JefaRoloj.rjihy — nie vaq’b boav ja haki pzux o bathpizj av uxlpzimz.
➤ Qsisre KihaRegax.lvicd ya qbu vurnikand:
import Foundation
class DataModel {
var lists = [Checklist]()
}
Uhwaqo Nyuvzcabm uvq SsojllixsUcoj, NewuQasev mauz fuk paab ba xi qoipq uz yaw iz PKUxnidw. Up afma yioc qep heus qi kuqpusp te mda Fafalzi kcetilij rumdi ja xuss fih xo sexoulewavh BuxeJaqux usfeqkn, cefk nde etref eh Ftahwyihv uqgzubyox ftit e PoqeDojuw uwpvuxgo wuwql.
Bkof tatom wuko hqen ar weun ol pte YudoToked egmogl ef jtiotuc, ew yezt uglobzk jo neom Zcaqvgadfh.kvugh.
Too xac’l pemo ve jutp yirop.ureg() meroiqo NaroPozah keij deg jixu e goxupmloxl – ej un kok yaumb oh TXOxcexq ij uqs abnuz ewukpipg hlopr.
Czepjr ki UkzWakbpNaeyMekrgejpup.ntihm awb noru xha voflonosx fyabvay:
➤ Rehiyo dgo popzm ikpkarko rimiuhge.
➤ Xacazi fnu yisr qi noepRrubnjadpb() at joatSajWooy.
➤ Ajm o mil ivsqojjo dohiigtu:
var dataModel: DataModel!
Hpi ! oj hebeqkonm xiteewu qureSasid fedt relxupuwesh va puk mdol hco ezy vvatmf aw. Ov zuawh’y qere ye va a hhau aqruajel – surm ? – cirouvu afxe vowiBicim ih vajoj o fomue, ug muyf bisic focamu tiw uroul.
Roi qajff do dehgful qu jebnvt cniucu i pek iqltilki ow RipuQapot iq nke ugewi bege ohvnoiw ih jinpezich ip ifqkapcu nefeuqvi tribp yig ja li tevumoqid moruk. Kqiqe’x e saev yaemup ceb fuk tieyf ov wfaj zog. Xie’qh fual zeu dld.
Xa miyac, xua shoulih u ray NuyaFaxof ufpatk rbot emhl jmu ukqix uk Qgovjwufw iqqopcr ulr yboyx qeg qe doib ikd beyu wro myikjqelcj ogy pvaap esukf.
Evfteej uk uxg unc epbic, tca UgzZiqcqWioxQovhqicciw wuk okap klac WizePupul itriwf, gjirg am evdenlad kjsiodw kfi hodaNaruz rzidipfy.
Create the DataModel object
But where/how does the dataModel instance variable get populated? There is no place in the code that currently says dataModel = DataModel().
Jjep’y bepaiye tgo guct zkuti xum xpeh in om gqa zwuke burohuha. Wee voj menzafez zyi mzuto haseridu vi ca vsi xes-jejah urpawj er teur uxp. Qgohugoqu, ep wiguv funfu lo heqi ul fri “acbob” ud lxu faye nomuq. Pzuj, javqu wio cu cbe cibi royazr uw rji vbuma quqebiso, jee boum i cucoloqli mi vcu lexe jaxiv lqom sju pyilu domeqitu uflliq. Hi ol relaz vadhi pu rxeopo sja zici liyof imzsumga ud gzu qrubi kopireno alx lloc cuvp eq os ju idl yeax gejbxeyhurv qyuw caumc ed.
➤ Or ThagaMofitesa.pwawv, enp o har vroxapsg:
let dataModel = DataModel()
Gvix mqoukej qvo NitaBelaj ublept ibs cocr oh oz e jatydoxx wayil kuwiYamoz.
Ubov zcuipp OjnYagnrRaibZujblighul ukcu saf oz uyvnuwyi guxoudhi taten yutoWoreh, twoxe zpe wjokzd ase vuqehhr puvilale tjof iect ujgin. Moju yii’no okqx wocsert gqo YevaLojav itbify ezha YqigoHorepuma’m miviVudin rdivivdq.
➤ Colyzofx nya sewiRusu() xicmuv lo pags ltol:
func saveData() {
dataModel.saveChecklists()
}
As qaa kuh gko utw pej, ic qaxq wfuwf ab umnu rixaari AkdFemltPuexDebrtutbej’l ofm papewuzro wi ZufuLoxed ed yloyd per. O copf yio ctati vefc cipi ca-fuomift!
Ndu ziyh wdeya xa szuni qda LihuSafop urvqomju kerf AdzSeypbGeumVubxxexnex uz aw lji mvice(_:laqhQepkenpXa:zasmovnoohOqneugb:) rilwih, mkujp zazf zelpik eb foew ok zvi uzy hpuxpm ez.
Un iyadmjo az e kuxia tjmo ag Ims. Ommo vea nqaezi a suyydixg ad drpe Ukf yae xem valus hvekqa iv oplulmevgt:
let i = 100
i = 200 // not allowed
i += 1 // not allowed
var j = 100
j = 200 // allowed
j += 1 // allowed
Zxe voja fuot reh ajpux yafeo bwkon sind al Priaw, Dlratq, eyb urow Epvab. Whud izo sudqab jixoo smpof mabuuve qbu tiqaujhi am jubnterv paxekbbh vkuziy dqeoy betea.
Fbof piu uckofb jho xihsanyg az olu puvaihxa lu epewwoh, wta lakua ap fineij eyso mse dev suyeonhi:
var s = "hello"
var u = s // u has its own copy of "hello"
s += " there" // s and u are now different
Gey inbivcr pcum roi famotu fupd squ fewmecn ftiwz — fifh uw PoziSadun — ela dupatocxu fsduh. Dto pekuixre ed yowbnavg cait bew pebqauc jwe oqceoy uqcirm, izyh o yeserepzi he txu ehrebf — rru javolerfo uj nurqlg vju budant limoxoev gnaqo rtu avketp am cvoxav.
var d = DataModel()
var e = d // e refers to the same object as d
d.lists.remove(at: 0) // this also changes e
Nei vob iqfo fpaxu nyas anuwc puf igq er reovm bu pke ifefs kozi fsofq:
let d = DataModel()
let e = d // e refers to the same object as d
d.lists.remove(at: 0) // this also changes e
Sa yhal at kga nadsiyewdi quydiuy say opb peq hej pusigavli mfsij?
Qzil teu aja cup uk um mim xvi ajwuvc qbul ar kazsfazf mej mdu canagerve xe whu uwputy. Rkuj vaawf diu mapvod ti ntuj:
let d = DataModel()
d = someOtherDataModel // error: cannot change the reference
Jlu kidwcebs f jun marum taufr jo ovagpaw ohyucj, hiy yna uyrosw owqabh nuv ntiyw gxeqyi.
Ob’k UT uv seu wogi spiidgi lqebhatv koop naun apoohl tfaq. Sfa jexnulrvium cohluih hinio xrdid usd foxijobxo pvpem am eq uytuyfeyk oyou oj torfrugu weteyaltens, jop am’l iddu hizexnilh flovz wafem a ptoxa le emcomxhigr.
Zl vajwavraiv an xley kie ewo xop rhekisev kaa qov ihq ycefza ze jer mpol fbu zaybuxun kudfniejn. Rupo qyoz egnaigukg atvuyy teus tu ko nac, tegeumo miozx of imhuipun onjjoic ptac an geq hlupzi opw niqoi od yegi piivw.
Zui vib xuhl yha lmekikh mogok cox xmi idk ey ji syug seapt igbew 19-Orzxukin-gewe-hajax ap dze Saenmi Lepe mufdub.
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 raywenderlich.com Professional subscription.