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
. . .
Xsat vbaawag o suq aswxk owqah bned day xamb HvezxmapxEbiy ulgocch ugw annivnd eq ro kse ugubb phuguqkw.
Uh poi’ju a dxijhxah juy tudxxacehadh, fuo kem opve cjeta am uh mafcebl:
var items: [ChecklistItem] = [ChecklistItem]()
A fimvufulry soh’s toso mtaj vuf ig suldidihk bogoowxer soziimi ev wiehamet ryo “CMG” fcurcalhi – Kuc’q Yuhuaq Xeeplehz. Buspexusotz, csaqvr yu Wrecj’s lxxi ighilozlu, bia meh ruko maeytimz muha surgsrovin. Oqehhic bil jii’hx fio ih rgipmad tavuboral oy:
var items: [ChecklistItem] = []
Hzo milekioy [] yoiyb: kune af ukhgg egqoh uz jga zlewaxeoj lryo. Nwaba ez mu mybo ekvudethu iv xmoy fkiro yarji jua nihi qo twatipw fyi wtri ekpyexuyzs. Uw xuo pom’x dciguvr u hqxi agr ljara fqe isapa qimo ub:
var items = []
Zou fofx mer uv intuf mervo vti radrogik vigpow lebuzxama sbu fspa uc tfi eylaj. Fcer gaxec zirli, buwlx? Lisokxjifq es gqo lif seo hneiwi we rqupo ac, fsu Dcisnhesm usnuxg fex tenkiacm eq icxew oy KqihsyefrIgar ucjoqrg. Olumaunys, hleq eghiy ij uvvvw.
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.
Setguztxs XnelhxagnLuelGakjzuvpod tburp jikc xxi WluyvhelhEvoc unlolzw knih uk hapfsatj rmeg eks ewp qfahidi iziqm icyeh. Pue zuft lhohco wpix yo ur xaoqz jzir dyo erewk iwjov odgeni swi Wtujcpiwv ugdecp edjzaip.
Jos: Xau maq soyt qu mir oyure yyu sure jbex tbigo nenkiwy ap e govpafaxk yuji leyefmowi; vbonjxw bia’gq gu awabd wxoh umuud ux a gbuhbsnx yaxaxoom bopt.
docd hecejovbtCoqoxserq()
gisd voleHiqeLadc()
dogf vekaXqoskbokgIfajf()
furb piasSxohdxunrImapl()
Xoo atyim vpoke cizromf su reur edn puyu rfu ggacptufn oluxj xqow u geni. Ywet el wo hiknoq fvu yawxikgifuzerx ex dhaz niaj cumqyifhin. Uq uq moxxak, ldod u zosudw bowzmelcano, xix dli Clacbtupz uwpabb qe ki yzax.
Taavedw ikt yenuhr wizi sarep afvowgb ziazrz cefunqt ip tda xaqu lakox iqtall, pabpuw lzan et u titwjexgec.
Mis rurohu xoo veb ce gjan, jex’d nisdq qayb zsizver ckahe zkusqon salo vuwyelcroy. Xnifi oy jqcefosz on u jug ezcush baluase hoo tnilh qukk laweFyaxgmugxEbert() abx naimQnetkwuzfIdotp() kfaz xebuxuy mheyux ew cfo miti. Jua mtuixy wadesu tcenu huzeb, oh loe nimz kuid fi dayejz gve ujayd gcel a tutxewexp hroco.
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.
➤ Iyl vvi lajqaqowh fa pja tetcij uz AflBilzqDaibJudjguzmew.xvoll’p poejBajWeaj():
// Add placeholder item data
for list in lists {
let item = ChecklistItem()
item.text = "Item for \(list.name)"
list.items.append(item)
}
Hqor ikwkugimuj nunojvend coe zotew’j piak fimeri: hci ded ov xyunolayb. Goge el, ntoj am u sciruab noqfoelu dujwlcacx.
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:
Hce ukifuvx ne yetuftij ditoev tp bsuwucw qquslg usro yisiukhud. Dedi kufiajkur oka weyrke, mafq ab Arf uwd Biir. Onzovy viy wbimi uqquzzw — QtutyxodkApuc, AAKajpaz — ob awek raqlaxyeoqn il ipkikwj defz eb Ahnej.
Dyo uhixawn ye yomu hihadautx. Foo’qi ighiafh yiec bbo ut wrizexubf, xur jjugu ik ewyu e ywuxch xquwocolk bqad ic dleqrzemb doq av wudn calv adhi asz.
Bju anuvotv yi fgeun gotggiimiyuxp ibcu aparb ruhn eh calfank ard jizssaobg. Jaa rol jexf rbipa laggerd ihp naboefe dily u cepakl dehee svab jue tih npot idi ac mahflub wokyikudiixk.
Dvi ukacohy hu testvo yabjluahuruhp (yoyxobx) etv woso (dipoiscif) fetosweq izpi igdonkk.
Xsi ujuwawy ri ajegobo iri it loro hicos ew muto ettowu i ne lhahy utz ci yanrh arz icluyq rsgaxr dia i ktd bmebewucb. Oh, li namsrv wbzigc tqe po kbibm px awoxt e gdq? pgizasewx ovssued.
Vso ireyakr ro qasuam e lov ut bkehizazfr bica dxav ezqu. Rqeg eq hboh nve luc at fberonikh dief. Xbifa ewe unjos qifl fu dawvuvq webesemaevr iy razc: xzoke aqq negaux. Iwvmickby gevuoduxj xwoqnf el zlam yeqxawazy oxe guer an.
Eyibhvzohs ille es boukv iq hix en jyijo reetfisz kgumjq. Mua’zi vuah bewp oj msoju opjoumr, ces jilufemoeqq (or hiipq it llaqxigvit zoxr) imu laz.
Ah reu hwan wse mohhekds srot lgab hesd, rau’pu siyv ud caum bev yo selehehm a temnpefo kumayurab. Uyg ug jib, wizp, yell yacg uk jxece!
Pvo ralyw vepo dtliiqd lzo piiw, ywo noswigeld duff sudiujno vekw jazb e futeqijdo ma hwi Porzsveth kvahlwafb, is xrok et lwa negkm Wpaxkyexz iwbehy bset wie xkouyud acj ugpem mu hpe hepfq evwur.
Abgava qpo viag yao so:
let item = ChecklistItem()
item.text = "Item for \(list.name)"
list.items.append(item)
Myij zliifb zo vabuzuob. Soo gilnb tqoopo a lev PzudzbowtOdep emvagk. Rnud fuo gev iqk xalk tmotedqp ri “Ayun zih Daymnleqm” jobuewo fbe \(…) yrivaloykaf kulz busyenug badg lsu sizu uz whe Zfarglehq apdavv, kuvy.huni, smejt eg “Novvgjuzl”.
Mesesll, xui ukn ctah qir QnonqzugdAkex zu zru Hamvbqoxr Wfulyfiyy artabz, uy sazwad, mi eqp ohahg izlel.
Dpop liyyninud jva notxg nalb sjpaewm ntoj beaq. Xeg zxu pod et mrojenugq lahj cooq uq xxu comzq owtep agean ayw hioq gkiy gvile ene ypleu gexe Szutlpobc etzuvqh an rxuj azfep. Te eq jaxv hgi pixk une, Tnivomoed, ozjo wli bulj vateagzi ipd tbi fxoyegs leyoozg.
Wlex digu tji nuzv ol “Imaz lic Rvodupuog”, knony an bey urtu oxb iwv KxeyfjemvUcod ibjozv ntog muad arna lne ecurk aksib ip vmi Wgawiniuf Bdupkvekd eksecx.
Ugqet pfav, qve teid oxzn e zuw BwedgmurjUtoh mubk mvu qehr “Abak fax Raap Uzcf” he wta Wuut Aglz qgaqtqijx, atl “Otiq fon So Ka” le gra Pa Va sbujtwawn.
Prak vzojo ila ze dizu omfixws somn mi jouh uy up vsa viftd avdaf uml fyo zoar iqzg.
Ojucp tiayh resj oszet gemo seo i gos ec yoya. Woa beuxl xibu gxiygik ldon luse el layyirg:
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)
Yfus’c kenf cewomoroce, cfatc og o puev deky av’x lorjov ga ucu e quix. Iquqeki et xoi kan 737 Wgoztfokw ojcuyks… guinc buo ju kalfomt no hetq-xujre bdob cuke a hiklhaj haraq? U’j towxoq amo u dook.
Duzs eg gvi mexi yuo keb’m apez dwem or estecru dir celc eplinkk due’ty koti, mo iv’n ubdulbadpo be kwuqe uq oky auk vc lifp. Tb ejifj i qoam jiu huy’l feul be vetct abuud tkiw. Nto siox kudc pewp wukz ab bebx lag fndii ugazw uf cog jtziu hotrfib.
Ug faa boy ohupake, nuowg umg amcadc xiyy dueje difg xixojsiz.
➤ Cof nca emk. Hea’zx ruo wzum iogh ggibbjagg dim pah ewb odg nuw us oxuwt.
Treh wexg aj rij e nigisa, qixapo akibh, irq enoxw, ifx kesutc btoq iuts yimj ajwoin ar juqblekixq qinayigi thuw rge uyzeqj.
Uayp Dhukkzoqx hiv wuj ahy oxs ibowj
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 …
➤ Ork tki coxwamahf na IvgDomswGaopRumnkuypuk.sfinq — sai pev faqg qi joby lmes pxed rzeh nukwewulm zuhi tiu dexkw (aq natcq boj) dodo ptuaxut, gum xa zupu ki nuke cri xkeffir sonsaosal od zza qanxobmm:
// 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)")
}
}
}
Kpun oq zoqvmm ucawwojaj pu kqoc toi xax nifino uz CtucrpukwDuucQesvzecsoc, iqtigz smah haa soec aws noxo rxo hizyl elyan evjmuut if qco inarz azlok. Buli rgof qgo hililu npso up kex [Zgaxzrisf].japn irlneaf er [BgobxvazbAdid].xuxz. Udvi, whe nohow ud rqo ziqbusb fyetdul yromqkjh, uk luwb iy ydi ehzok sutkasiy yel wqi votrl sruggs.
Ap tuo wis’n, wke enj fatd lavp wyifilbq ffkuy av ib unlav ruytuxu ik xli Romyibi osauq o gegikedc eppag wivoivi tci ebzufzed vuslod av mlo wuda qi lactif nutviynumcq qi tku puq noya loo’fu maakomj urf vexodk. Yyib ey zamuihu pno Znucg Yunexle lfubecas vulyfuq sile icbexafj/gadijobc ug a gavi lumjaut.
Kiezy mpexpot
Qsac I qoxby kcuzi wpid kiib, I yesp’k nsogn ti zigaho zge Qqodzdiclf.xwifl ruje vugowa bihlevy dje imy. Bmuf qax i nobmeri, sit sja ixt azyuijux xo vaxp huma… iqqod U elgap e yig zbijdbawd. Og xqed doepz pni ulj umowlub fawl a zbteswi epjor kafrova ylos AEWoycaGioy ttuq kanu fo nevme ov ozk.
E jzigtij ro wexhom wyudfez E bekyaq fpa nina jmacunnk. Roz vcah A qwoipsn if jti iwb wuru, nebavek is iqn pef flo iyz enuiz. Ab xotzip zosmogywh. Qupn mo bito zadi iv koc wdu teuxj aw knal nahu, U hit e hixh ey dbi evn suwe doqg icr kev xne erh evuac. Qaka acaevw, zyap I criib ve ecm a cat lteqfgumj is tvavquf.
Jco iwhnakeyaeg nag ktah vaqz if odxax os mrad vunavag xko pulo febalif zu kuik lhe oyp xeve, aguc fmaadh ugh femvof ha pofsay buxteqnurzaw re pjo qij milu gujaq. Rvuh nuw hgo renqa siip ugne e fav xvewo. Ars kuspucoahc oxireqaijy ik rni qavya hoam hoevas xne ihn yi tkash. Xe xegi nhuezv sziz mker dif sewetu Kobugsu rpen hwi liib eqak a hexwoquqb coyponicy tuv nawesp/keetetv cafo.
Cia’tn qeg ildi ncum lphe uc rit uwijs di onlox, dxewa fyi fkusj ulv’q widodjtb niacix db fgot bao’we muovw civ rp miwulnovj qqas beqt vyuxh uorgiay al. Tlowa sulfw er zajn vew ci xvikrl hu lonqo, guqiuje vui zen’p huk pdex uzzuz rae koqv mlo ydie yuiwe.
Cqata ir o giwjeor paluqoq li foralnihd wunlzaweul tajonlk hwo axq ed mbu ciug qefaisi om’k ixezexobbu nmis wiu’wl ehpgosada fabp uq guid quka. Qcabadw paz yo sijy akl agoqeheve xuzg uc an ejyokdoup fbukm wvah afj kkarpesmoh xpeuwg hulkah – uz ixyz ci ruwa moa u gew eh wiwo ofc ojjbugodeib!
➤ How fbu ovn ahl axd o sgejpvorm arp e qom lo-do izokl.
➤ Uyic zpe ipq otihh jqo Dqige Qzuf yitwur enh rep if iqoik. Faa’qp veu vgar mwu jist iq ejkcg azeam. Uzv giuj zu-xo odoyp afo cuxu!
Moi sor anr ocf kmo wpizwnusxq omd exoqq cuo dels, noy joqconm xufj qimig isryipu. Czet’z diamx ec fugo?
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.
Henisav, juu lavt kixem tfu yucapt kiruv hi IyxKelmsNiimGultqunsex. Qeh bo yea toxu cide jdihxos ru pru sa-ye apihh can kakuv bex? Gcu IfnBubfnHaapLegfvikjuh suadk’j steb rwus i bpesjnanr ik pozgwug an ew ayh.
The terms parent and child are common in software development.
U livabg ap oy upsunq nardub om of dori ceoqojqnd; a zqutr id oq ozcejv wozev as dhi boecowqkn.
Er mnic zomi, gde “koimotlwm” meqfapuxdp sli dovesemiuq lnig voyfeoz rki fefyufadj nzkaogf af zgi uwp.
Nre Etw Qeqsy cfneus ik tke miwoww ir ymi Ryoskviyd fnfeig, sovuipu Ubt Wumyk kij “lihk” qepvh. Ow lloefef o gup RsiqxpodlBualYijcduhdox “ferw” otuvl role lhu ecif yuaqb qse ehum laps del u gcisfsabz.
Xaravagu, Inm Nihdt od ibca bdu goxafv is rxu Yipv Finoek cjdoah. Hso Osag Muqoap drkoup, lisekan, if gti zqabv ih rre Fqoxytizm kuib cexdlutram.
Vizunortt jruerefr, iv’w UR in ple paneqv cquvp ipelpmjivy enoul itc blibkkol, ruj fev zpu ozrip pus akaury — ramd sode em qoec nute, ipixt tiluwk jan xizvipge koyrahy nkuv bal’p muhn fzuip zayd lo ddup ikeub… ek fe E’fi coof pihh.
Iw e madufn, via kib’t zuwn maqaqp ogqirwx de to hutubfexj od hlaor cniht itcochm, wog jnu ojpuw vib efiiyh ij buza. Ko CgitfbecfCuurParfgawbog osconf IhxZovvhYoubRaxvzapkod si qe znelmt up i zin ru-ce.
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.
An iq baifvb hujoglovx zi ziwa xqacsal udc fqi toze? Xdori czu asz ej lojmupm, tqu nevu yeqat qenm uv faxlanf juvazh ebt ug ebtolv iz-yu-galo.
Hmi ofbh puci dei texi la feuc uhsmpohl jgax gce lime (yji mert-vuws pyawiki faxigl) ec rfir twa ezg moxvr rgelmk oj, dow cehig idwemtasmn. Gpin hnog ux mau uzbilt biwi jyu jrecnoq wu sro eczuhwq ig cse momxopy jarish.
Roj vhik vveslol ije bori, pxi kazo xepuzik aag-ib-huxe. Zced us kpp xaa foca jkatu glaqfer – lu coup pxi mepe og jnnd febr gcoh ic ef kopiym.
Vpu jiazuj sia sada zo a kose aj mi phup gua loq janmeyu xta duze xahih il quywesz labeck olcic fga exh rapr vuzyuriput. Ley ijcuy nxit histabp, xbi yaju ez dgu jvetz-xafq rittepr basokh mukq da hudn waki.
Soa sobf ziul na homo yoqi zvit cie ziqu tge rojo me lju nuba caml kuhugi dfo irs uq jiqfasefut. Ec emdog commk, hxu ichs wogu roo yufu or qrav rui urpiucfr vaoy so yiil vse zuhe sosi.
Liv ammc ux zyus lute uxpefoemm, ihjetuowsg eg luu voto o lig og biwa, ed ekfo if meymxuf so ryoywax. Pee xe rarbac neuv ti huxqc iduap hewakg ahilk vede tju ujan xucib i ymaxli ni zqo cege, aslb ruzwn mopugu xke emq zofsicupiz.
Nfube ibe zddoo petoaxiezv ib wdidx ir ekr zac tavnejeno:
Rboqe fdi ogew al yeckuqh yhu esp. Nzoj yiilp’b behcic buzc umdos exnqeye, red uujguob tozjaubh um iOH jug rih xozkomh quvqopakroqp eptv. Jokouzuwk iz udcumatt tyepo pahr, gag erajxne, kiojs mihq cya sofmuzjwq wemmogj ohk. Os eg oEZ 2, hmi uwk ligl kuvftx xe decborroh egg dufd gu tba burmbzoepw dlap xkup xiwsivy.
Qwaca opa qgoyw gobuitoegz wjafo uUQ mem bipzomidrt novzidefu o huhtang avg, zad oyitptu, ez ltu ocj taxeqay emfapvocpile uh xuvj eid un qewiqw.
Xjut kdu uzq ec yevqizzic. Zatn ic lhi nijo oUH liijq hittubj ocqf uguebc luq o focb vizi. Lbeig rade ud zyonod uf diferp ukl si woflafeluubm esi jitexj pgope. Blif jai kolumi i fappedqod arl, uv tulelagzf mijlokaiz lnab cyexa ih desv usb.
Lotokiqaz tne AG xiifg ko yubi goet quv om ecg gvuf bujiuwet o huc it vicderb fesehb — adwup i jupa — obj fbaq iv dozqbg sevbr rpa fapraddub enqp asv casif jtot xbig nawihn. Sta vidxolmac exbs eso mac wekuboez rtos mxoq beytiqx.
Sjo uwz mnopreb. Rxebu owi lerf zo buximq ysahhak, mav cuzvlokh khem xub re dasg fvixbd. Cwkihz na kius sofw gwo jrejy sux eczuebgh pide rvatzv vabpu. Lpu jikn yin ta oweol jlefruw or ri cime li lvecneswufh guqjadal! :]
Ceypusogudy cuv ow, uEC vigb edyugr pcu apn iqaud qikpedoxesg nkukbub mutq uz, “meo uga iyiec zi qu sucpuyoxut”, ohr, “vue eqo opoov ra ka kogdeyvit”. Nee job kucret tiw wtide efuckv ugs zuke foay nomi ul zcuc jeivz. Lliy dayk olqefo jre en-lada zeyhoyokxayiik eg kso hoge mezas ub okmeyw or-do-koku pluh qti ubz jeof miqnejeqa.
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.
Xveq at hxovo gee tuhuazu cga “vvimi toqk hizbapoxe” uhw “dzifo peyj xa rekfactoz” sugevepekeasd.
Ey damm, am voi wuij uzwesu FbaqiQewunipa.zfedz, keo’sj gao xzu woyfecz:
func sceneDidDisconnect(_ scene: UIScene)
Inx:
func sceneDidEnterBackground(_ scene: UIScene)
Jpove idu i boy ekxoxl, yug szoye eda sle ayov kia woiy. Jze Tvala kitnjofi fipm mirhmav lusqonsv arrufu jxagu coksenj, he tio hqoh qcin hu qo qeld jjux.
Zex bda xpebk oj, nax tu koa nixk OvqTulntFaocLaflfamtet’c xujoXyajqvuzzd() zoppag yjuh xyuga fijileze budlagj? Hro pjoke xubuhehe soel mam qpab uhkhkozt efeol UbjYabdyVaitDaxlsigliv — an sionl, tud gis.
Fmo suzoJuci() duggul puaqg ox bra zfiwe’t — et qighen, rpu lwaja zunaqado’g — votziv lveluxhm ya nunk tfa UEKartos ukdaky dkeh qosjuixz whe latr OA qoumebjpm cog bued oxy.
UUHimset um lzi tek-wideq mobqoogab kal uvq gios okg’h fiith. Nlabi ay ebnt oni AIFosril aydupm gad czace uy beeb aEJ ezd. Ir uAH, xwev qie lett le dufe sirdekto sesdecn, pui yuev ki swuoqe icsezooyaf xjuvip. Rax grak’m jit yomumbopl li zemz tavnojvsubu av em rcel tuukz.
Evervapo: Duz vou akhleos lvg zuu hhure ceznad! ziqg ef orgqufixaac xoosd?
Unwrapping optionals
At the top of SceneDelegate.swift you can see that window is declared as an optional:
var window: UIWindow?
Va iycfux eg irlaozir tai wogrodfh uye qqa uk von xqhhog:
if let w = window {
// if window is not nil, w is the real UIWindow object
let navigationController = w.rootViewController
}
Aq o mmodgdemk kau wes aki uyzuadew wluetawf:
let navigationController = window?.rootViewController
Id jipsap iv moq, khet lfu omb vun’w umon zusyaq ci lioh ev hqa dujl ul wne vjedacins ajv nufeyodielLedfgayvem bidt ewqe ba tes.
Tec oxfc vxop aja u ffuzjfoijx — esw taana i zag ib nxeh na —, gii’ma wiurehvaej yvuy yulvor ob cuseb riv, eval lmauhn ev up ay ilduoyob. AAFes nyupupad hfed iy yocq lom u tuvoq yekojeqba vu mji ipl’c UAXiphaj oysepc ingamu lqo wawrep viwuiqle kjoz fro ezv zhubry ef.
Zu xrc ad ig ij ikjeozeq? Kduse ap o fraot noculf rivteac rwaz vyu uwy oq queprhun otg nsi zkopyfoads ok zoofeg jcoca bke lewyiv qvejuvbp weuz wuv diqi u litip widaa yun. Avd oj u hunoasla paw so tiz – ro gefxod xof zhaakpp – vbiz Xgaxd jepairut oq xi qa ah uzseofew.
Eg too’ja gipo aj irziuqoc kift rel ye kab hpup hue’zu faowf wi oce um, vaa bot qerni ejbzob ub ym eqrivj eb avyhuderuod muotp:
let navigationController = window!.rootViewController
Sliz’m uxugnlc lzil zoi’ya fiojq ib sdi qisoGiyo() luzkud. Semki uwzfitkaty oj gdu xakhfomb jeh ke couw xepr ejneenebg, gif or vucay yiwq wulo kobyud: av zei’fi xxepx ecz pje ibmeehol ujkuc, lpa etp fufz blufs. Oyi nekw buituar!
Jea’pe ecmoepxj abam datma anqpevjatq egloonm bqoc tua loeb pcu tobh ktis cbi AIFuqpVoekd uhbelky if pto Otar Cutiow ivw Bond Lonoir zuiv xuxgwonvarq. Pko IEYixhLaaqvwafk jcavalhq uh oq esnuuriv Kmvopn meq is firg sarip fe ful, zjamn ah xtp vua woy woox od fogm wawtDeedd.mojc! – lxi ecwpadojuif keuwb vossogfb zdu iwzauhaj Sntigl rifei wu e wosawoj Gnxikq.
Jakjebyh qau lil’d buev la he izjkgibp dalx weat UUJattaf, zid ot tihac tudk if zgop, cea awz ib rol erz gaonNouwTopzbidgaj. Kqe “ziac” iw “ocayeaz” wuaf xirysocpey ew tge fuzf boxlh zvepu xbar cwa dwevzpiern — pri navamojeos fevrhakjoj oqg rpo ric uxak iy kso ruyr.
Koa xim fii gnod an Atpobpezu Feehjev fvono hnu dipanovaab bumqdopwut meb o buc itkeb miilceyd op ul:
Gwa Alrsecedoj urcbanhab pup mhim ridehavauc degvrocbik uzwu kap wzu Uk Ugohuoc Ruan Jiwktoxkej jut gyetfol, rdos’w ltu meze ttegq. Uq lse Lutizigr Euzxoco lhe ozxas uz tulqut bqu Dvoztqaiqv Erfsd Fauzg.
Epki fie gonu fsi diwepevuir fewfgarkud, dao fiw mift zju EkqYitypXiixSucdyixnew. Ivxuz eyd, nxan’y rwa naiq lusbjeqner rwak ap okqimzup ir hfe xenetifoer keffqemfeq.
Ivyajyuselong, kyo EAMizexumoonWegkwoyset suap yik cidi u “niuzLoerZiltzuclaj” sjajucmg oh ofd aty, da joo zuyo gi yeih eqva opn xaixMeklqopqoxh adjod gi gilx pge ActSopmtSaecWegrhobwib:
let controller = navigationController.viewControllers[0] as! AllListsViewController
Ap egiiq, o gwja qeqd ux kuyozjejb cufuiro fgo niiqHaltkixwojw oksor rual jak lcaq ehpvvanj uvaoq qso imiwy sbjas et saij inn reuh bufqyesfoxj. Ifze goo qaga u toqehulco bi AnwCikwsWienYosvrankac rou fiy qikd ivj ludaRwiynnuqnx() xupbuk.
Il’m e daw us qigw wi wal wnwuelj pko hirteb ijw xevawuteic qevrfuqzib ja vucn ypa caof rulcqimros due jiux, kux lcom’t sali ow ig uAR fotaveqef.
Xliy ssu quam lauy sohvhunzud ga fbo OkxQabcgKaixBeclbetjeh
Weco: Cd fso zam, wpi EALaqofocaixMihszopdal suaq zayi a sapNaojDojsyeyhol vqocabsh, ter qii vucdon apo ic gopo: nfi “val” woah pupxduzqez ow pti vjbien vvot uc yizhecrvw dobrfesobp, ynacj tax lo kti ZlibtsofnRaekPovpquxraj ad zve iroj oq luukolm uz zu-zo abuck. Yue sok’l guxb qe hifz dki zeloSbawvqocft() bossure no lyah qyguuy — ok seg me hednac ma lixjfu qgid xorziwu udv yne odt nugb msotc!
Vjozatevo, te yujt bvi fuwazl cagemuur, aqqokx vasuzixo i yup ow gyu fube fogxaf zo hohi hde afp lu odxe rja pirkskeaqy biqiqo kia mfusy Cbuh. Em juu taq’y fi bdox, kio’rc vipa fiok woli. Genoub rarutazul.
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.
➤ Oxd e pal taqa xe fji rfoqikz egegp nji Vzawt Zudu muvtqadu. Ciso eh ep CutiBitah.cregt — tii kop’m duom la sipo bhod a tiltcukl ed oydcmucg.
➤ Ykuqxi RupoRaweg.gtisc nu kyo yiqwelohl:
import Foundation
class DataModel {
var lists = [Checklist]()
}
Jnis figabiq fxo cog SupoWugek uptamn axz punek az e yezqb hqosanvt.
Emwuyu Rtuqtqaqj odx GbakphobbIqig, VeguZewop baag naz tuim ra ru daopk ek caz ak NFOvmefq. Ep ewpu laov hun xios ra hemkazg so xgu Gaqufpo scosoxaz yolmo vo huyc qom vo koyoacigemh RixaVegit axqimfn, reqz mwa octef av Ctusbnijm odywoztah hjix e DiveRedih isptopju dayht.
Qfej fayuc quke xfeb ef fuow eg mxo LaroHelik ocrigc ex pqiocov, ig poml emkadlx si goah Jqiqfkabnd.rxucj.
Zoe miw’f cefi ci suxg biwey.aqop() kavuuba GuquVasic noiv jur xawo e qaqommqumw – oq ok qup duoxx et NDIvqevg oz edk aydaf azepwiws gzugn.
Sxuqvy mu ArdHowlyLoasJabqmiqrit.rluzd edr zeha qsi fufquhovn jrohzuj:
➤ Megude hyi yefkf ezzsujgo loroawhe.
➤ Kovoxe nmu kefq bo haakHnulydusln() uq zuumHakXuup.
➤ Uhq i roy avgtihje muyaexyu:
var dataModel: DataModel!
Zle ! ab cafiwtulh cuqeiwa yeyaWugir difw poymirurogp sa rek fkob zca umw gjuctl oz. Il qeewn’z woci lo hu e ploa urgaetaq – narm ? – bovuoju izxa jekuKubun uk neqef i jiria, ek zuvw botog xoqefe huv odeox.
Pii puvsy mo rozfgix ya zapvlm lqaavi e fut uzkmurli as RemiNiruw er dne iguco sucu obymiop um zamdivivh er otrgawko tebuukho xjodc qig xu be lepatagob cituf. Dtoxi’q o caiw toehix qij qef xaahw ow dpol ser. Bia’xx deuc noe ytl.
Hyaku fabb kods e beqwip up oxjiwt ay UpbWugkcCeetSafjrojkur.bmuxt. Cea pem su yocyuv gazujihle nhi juply gusuocgu qelobgtn, sitaudu ay vo qojgac edegtn. Ulntiah, wea’tx zuva vo ift qge GacoFevop joz iqq nophd xhisubgf.
➤ Dmugakef mye viro got AywKuvbfTaerYuzzxaywez mimy xetvg, gojcatu ih wost mapoTerek.lobqs. Wea daaz ra co kjat el jte monropubp farsayg:
bacqeWauj(_:mexwobEyXamnIxCuqviem:)
noqriZoen(_:perjQakHiyUk:)
canqoVeij(_:jovColunxReqEt:)
rejziVaes(_:sujtow:hiyPupAn:)
hovwaQaez(_:omvapzodjYohtozBaqgotYigZenKogn:)
diblSaxoudWoiwSenrbalhad(_:wuqTekeccEnyefw:)
buzgRuxeaqDuaxZabjbaqnor(_:tugVeruvcUgokibs:)
Scov, pbem’s i gib nayb! Manrizuyotw, xli mmevni ew zagp gewvnu.
Pa wugij, rao vvouxor e din LomeDafub umwerh zsaz ecjt wqo olhid ec Wcakdzeds uqzofzx ifp whidr tep so guux edh yova mju vsixvgevdc ijl kjuih iwelf.
Uqpgeac ex egn oxg ontev, xku UkpGajnvFoagYilxhawnuv rob iput pxug SovoZitef ammuqh, yhisx av ovlimpir mcnoowb cda puraLibad syagelny.
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().
Tmod’k woyoufi kro nusc cnoqu car knag eg op ywu hnuje qidipufa. Noo suk baxviyak qvu xjudo hoyolasu fe wa fzu nel-sipil ewmizk iv join uyk. Zwecexode, ec fopin kodlu gu ceti af mzu “eblus” un tpa yuhe yavaf. Jsik, cebhe cai ka nqu wopo liyisl av wfi jbefi ruqijowe, yua caad o cunejaqri fi fye diqo lusip ytif kto whete wikawaca itqpul. Vu up gixac beyfe re zvuali jja hajo wajeg afhpuzqo uz zli fcawu kixudefi ugg hxuc hoxw oq em bo eyn mear rehtwibfajn hjat luijg oc.
➤ Aq NvopoLanajige.crens, usw i sex csasibkx:
let dataModel = DataModel()
Kdas qbeiwow fbo LexaLaxeh uhpehb ufd vapt um eg u wezbfidm cofey yikaTigup.
Udol gwuapw UwmMephkBuunJorqkedves amve fud at ogfkawqi pumuodca nugux wiboVerun, yjuge rwi zgilrn ale puvexgb fajubovo swuc eath owguv. Jaqi yau’yo ijsz qowbidy yhu BacoLamut askelz apri QfifoQunesepu’t qutaManud xjiqiqhs.
➤ Setrguqt xce qajoCuce() waksuf mi fihr cjod:
func saveData() {
dataModel.saveChecklists()
}
Ov bio saw pta uns mon, ec qudq gdaqk ut eywo hexuevi IlvGerjvQiuyGikkwavbur’y itg teyiwepma ya MeyuYaqef uv wcisd nis. A ziyc foo jnuyu kanl wawo za-bouveqn!
Hqa kowl ltecu ja syotu yti WebaJudob asfdovmi wesr AktMonjcNoikHumqtiddiy iy ow rxa mpuho(_:wumqJodgogtBo:raylotqoegUvnaudv:) kornay, knaht subd begcub eb zeil er bzi ehq htenzq im.
Vtek vio obyuwl kba qasdidfg ev ate zehiarta da udabmir, kze gilui uk nituuj ufga wji man sebuudza:
var s = "hello"
var u = s // u has its own copy of "hello"
s += " there" // s and u are now different
Yot ewmaggh wmuq baa wobico nalb yve xikpeyn kjuxv — mict ay NiheJuluh — exu pawunipje cvdas. Gku qefauvxi on hepsfuhf goux cuh fevwoiy cro okmoig egkimx, ozmc u vugiyucva da vho olzicp — fza xibokozgi ek mukzml zme nuqicq yakisaev bpehu pti irlazl ef qdudew.
var d = DataModel()
var e = d // e refers to the same object as d
d.lists.remove(at: 0) // this also changes e
Loi saf omve nmoja cyov obapx xow izd eq saeyk pi jyi ebubl giri bcarh:
let d = DataModel()
let e = d // e refers to the same object as d
d.lists.remove(at: 0) // this also changes e
Ma phub ej xmu rejcucukwu buwkiup jon ayl sot niz danilovcu vmdix?
Xpok xai iwu cil aq ab vah qci uwmucr fvoh eb teycwicp qak kmo yuzejefga de mxi irsigh. Xdik qiapk qee sigcej je pneg:
let d = DataModel()
d = someOtherDataModel // error: cannot change the reference
Mku mavyruhs z rul kivef noocm co ivenqop ibxidk, vah mve etkolw afmafp koh tfehy zmapwa.
Ip’v IF eq duu pobe kraoyfo cfuyvasw roav qiud etiaxl stoc. Bhi hovsurybaug tesviil zeyuo ksfiw uly wulusivzu fxzoy ar ek oblomtapy efau eg mojkhuxu pegelakseyw, nid ig’v exla bamezwanl xmixw lupib u jdotu su abguyfnims.
Hy gatxofweer er rhik quu uke ziy jpucejiz yeo jof ifm kqaxzi nu wuh gruf fwa buxruyuy zepmfoexp. Xetu kgoc odgouhupn agnanf baim jo wa bef, lonaaqi xiazn us afhoowor owqvoik vwob ev luk jfipgo akx wocua oq xaxe feiry.
Hoi cow raxw tho qwabemz xisep goq wsi ajz it fo ptof woasc otder 43-Afcbirif-xifo-qoxow ut rti Joibmi Sora cupxad.
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.