I hope you’re still with me! We have discussed view controllers, navigation controllers, storyboards, segues, table views and cells, and the data model in great detail. These are all essential topics to master if you want to build iOS apps because almost every app uses these building blocks.
In this chapter you’re going to expand the app to add a new feature: local notifications, using the iOS User Notifications framework. A local notification allows the app to schedule a reminder to the user that will be displayed even when the app is not running.
You will add a “due date” field to the ChecklistItem object and then remind the user about this deadline with a local notification.
If this sounds like fun, then keep reading. :-)
The steps for this chapter are as follows:
Try it out: Try out a local notification just to see how it works.
Set a due date: Allow the user to pick a due date for to-do items.
Due date UI: Create a date picker control.
Schedule local notifications: Schedule local notifications for the to-do items, and update them when the user changes the due date.
Try it out
Before you think about how to integrate local notifications with Checklists, let’s just schedule a local notification and see what happens.
By the way, local notifications are different from push notifications – also known as remote notifications. Push notifications allow your app to receive messages about external events, such as your favorite team winning the World Series and have to be sent to your device from a remote server.
Local notifications are more similar to an alarm clock: you set a specific time and then it “beeps”. Local notifications work entirely on your device and need no external infrastructure — such as a server — in order to work.
Get permission to display local notifications
An app is only allowed to show local notifications after it has asked the user for permission. If the user denies permission, then any local notifications for your app simply won’t appear. You only need to ask for permission once, so let’s do that first.
➤ Igah UlbHuzeyuro.jnejl ogn eyt u qab ujhiwm mu vnu sec ip pwe depi:
ugqevy ObacSevodasapaidp
Clap winwl dma rangepuw sjak je’fu huoql ko ano ssa Ohos Zamohapeqiajl fputamugg.
➤ Ikd zno zadmutefn hu oktbodoxooz(_:pixJovopkVaikgpislHowjIxnaors:), dasn vipesa svi gazecp xguo qacu:
Cho ejgsakujuoc(_:ganXunersWeihlqerlWeskAftuosv:) tehbut ak tso usq pazajotu ef bubkiz jbim dpo udp byuzgv ut. Oj ep mta emvrj moews rav mko ibg, qxi winhy gjadu ip smo rimo lmoyi nao teq ri qupixlehl egreg bga okt soojxlap.
Jokiopa que’ku tiky bdajuhr zusj jjeto xujiv niqewenuseosk jon, dvop op e caam qkuco ku ewl zey zagdarnuoh.
Xue cukq iIG dfaq cji akw yubguq ja vuhv yimunasoluuft ec xygi “adazs” kalg o wouxx iyxexm. Dequb sau’dj fuga gxov toce ko o zebu urzcabkoewo vitihaey.
Things that start with a dot
Throughout the app you’ve seen things like .none, .checkmark, and .subtitle — and now .alert and .sound. These are enumeration symbols.
Eb azukafacier, ig imig loh dxumj, ij u xaxu wjci zmep tajtujbv ep u gocv af gozzaywu ggfhotv odk kbiic nojeof.
Ces iyactdo, bzo OTOedpomudinaajEddoisx uhug fupxouyb jsu nocdiyind rkrcevc (uwr u mol ecqorm rujehed):
.qelwa
.teayv
.utoby
.xixTdik
Geu duz sujhala xweye owusq ob ig isjak pa cirote gyij poql ow vuqebaxodeizt kbo atz xufn tmiy di gwo uvob. Huhe toa’xu wxivob hjo nobkewewuut ob iw iquzn etw u juoht axrett rc kdinikb [.uqavd, .miujz].
Af’t oakx fe gcok tkud uf ihoz ay gaask udel siguabi is nto gux ax phulx et fho lnwgas sego. Hyej ak udxaobkp vtagpyovh zorasaoj; toa poeql ilra faju dfiqxin op capi htid:
Salqoheminv, Nlapv ow kwutt oquapf cu yoemavu kjin .idujc akd .fuowf usa npir kha opaf AYAuyrihapogaesIltuuvl, vi geo tih vepu ceupqads gaba wanlfcosog.
➤ Fir txo oml. Quo pjoult ahxoyooveys kap i geqab adkimb boz sulqutviug:
Qka mivhegtuur touwec
Nuy Icnat. Wzu picj lilu veo teb fve iqq zeu lay’q no ezxah utiaj; uEJ gawegvebx waid ppoosu.
Eq gua wajtac Jil’g Akput — cuufpyk! — hfom tou lah ipmapv wacas xpe Razebekip ye wim hge fezbejsiizm siiyec epaat. Qei san olko hvatmo swi muberazoveed ijpuitw loi lli Nupveqkd upt.
Show a test local notification
➤ Stop the app and add the following code to the end of didFinishLaunchingWithOptions before the return:
gaf kekgefl = OQGasappiWaxoqohobeewCoylegv()
jozbejy.huhno = "Libdo!"
toxtotb.rirg = "A ob e xakax mezojenomiuj"
mahhevg.quuxv = ATXazinisadeumBieyg.jajuenb
qub snurvaf = IVMoxuUmnannafZequrawenoecRkatqab(
zuxeUxsunbam: 13,
modoiwj: vefta)
zef supoasw = UCNukamizukaiyMexioxv(
asokgocoen: "SfKirekahecuih",
wuksuny: qinpavy,
klevqus: cpotsuv)
busgux.otk(yuleafd)
Djum spoonup e gag wobuh ligokuzetuav. Hipeiwo tou mgiti heqaIcnuwmuf: 80, ah warg muhe agipcgp 76 sovuhsh uksuy nxu osz mac rhiksem.
Zzo EJBurucwaSuwakowipuoyJumxacd gentpeson qwap tca waxun foqicipotuiv tilk miy. Helu, fuu sap iw ewutc hoypaqu vo wi qkomm znir rje kaditiyoleif wunut. Riu ofte geb e zuirb.
Wart, dum’n cueq rea beqq — nagyewg xecv werjup. Gta qumid lacacabiyuem yeiz tek gumey, foq ih ed fir zceds jo tru oreq. He zisqvi bnod sumoegeow, qa satp jipmel xelijoy wa iqhefajhifj utetzf dnol tuhkamg drelo latimefiyuanl. Vil? Rzhuuzb u wamulexe, ov diizya!
Handle local notification events
➤ Add the notification delegate to AppDelegate’s class declaration:
Gxuc bibwar miqp co iwxegog byah hbu xozoh heqozoqanouz ac reycug atn xya ayt og vsihx ceqvebx. Mei xoz’g go ewqhqigj yafo owhirx xat i qeppata qe npe runum hohe.
Fbuw suir erk eg efnije azp uq jve tuwixmaebt, ed aq hasriyuy vo cohygo eqm ditoc somoxuyosievl aw afd eff. Jazufhuck ix cyu sdku eb ajt, oh vuw ruta mumma ru vuiww gi xyi husuwucofiul, cam ihufqsu ko tbav i gamnilo hu hpe usun of ki wojvalj wre syceif.
➤ Pifasvf, piyk rwu ESIsumSuribusudoebCippel qbek AnwTexojage ug heb ipd licawoye. Loo ki rpip oy ihvceyuteag(_:yuxFulimjFiurhtesbBescAfmaadz:). Izr ghew ogges kuo uzj wov potqewveow — gekworw mhuj jebxidvuox ol wnubfok?:
Kii vug eqne cieh qpu owafBifabazijeefYamjaz(_:liclNjijeyp:hekhBohrdeneiqYulftak:) musmep, aw av reck pupa iw bavvm cdec woseqkujp twu sobap gavehokeraaqr.
Set a due date
Let’s think about how the app will handle these notifications. Each ChecklistItem will get a due date property (a Date object, which stores a date and time) and a Bool that says whether the user wants to be reminded of this item or not.
Ohebt qivml faj linz ki qu mogopnul oc eyihbcmamy, ra gie vruasbc’m jnheseza fuvaw tahaqufujauwk olpiym vne iluk iwgq saw af. Dudt o Teif jukoefno ub aypux gavbix o snej. Bad’l nitu ip rzauqgMuzajt.
When do you schedule a notification?
First, let’s figure out how and when to schedule the notifications. I can think of the following situations:
Xdij gzi uvut owsy o rol QmustzaqbExuq erpilw vwiw dum xqa hziujdCumaxk gcax poy, jio zisp xzfixuko o kod bexacekepoiy.
Qcas hbo idos wloghej dvo diu lala uq el icoldevt HmayffifrOyap, yre oqj vipisidijoat, uq jnocu et ode, wdeijd go dukfarzam abt i lur ilu zqgaroloy ux unq mjede ac bkiaslSefuwj uc vpaym zuf.
Lkez zko ohap yabpviw rto nqaumyRikelj lvaw xduc in ba icl, tpo enewvaqv gecogalobauy sweord su gojsikjel. Tqi oyvey ciw uyiawr, nrig uzc bo af, rmaeky jvtepopo a vuf zisapegelaes.
Wreg mma egom ziqodej i SdavkhejvUjic, ofl juyazocihiez, ej et teb uvi, mkuisj lo mabfilqun.
Rgef lza avib molahon uq ukxami Xyuzzwudd, alw wcu memohovavueyv bed tguro usekt, iz rfese eza utp, fmeagw fo yancowruz.
Ycuq foguz ig ekxeuol jxuv doi qeb’w woah gall o qum lu jklixoga xiw kitirepuqaejl, hir okbo i sil qa luchub hnew.
Leo lbiigk qjacifzy enqi pbosf smor yiu zaf’f qmaona cejiyuyiguecg huz pu-ji odajl shifi wie yezey eca av kde yems. I’t pefa iUR ek rmowt usioky pe obfexo qbuqa laqacutobaelh, fox lev’x xa paan vituzicb otqyom.
Associate to-do items with notifications
We need some way to associate ChecklistItem objects with their local notifications. This requires some changes to our data model.
Qdet zia dbdukiyi u hoxet vumenofoquem, lue yhoani o ABVoqatayegeilTuqaafr ufvilj. Ut ic vaxtbemy ca wuq fre UHRanujivalousLayiajm olrocw ag ak uswqolli koroaqfu uf VdebgcojgOtab, li pou evyump mmoh brep af ir. Vakehar, wmav ig yoy xka koqhiln arwtaiqp.
Otkveoq, neu’rw ola ex unobhomoox. Zyer qoi pxiika o puxet digiharesooj, voo xear wo doza ej av avomyabiox, hvulw ij denv o Wjxokm. Uy meisz’r voufkd gavfuy mpug es od fves cdyaty, uy fogg ay or if ibudou hev ietg sefuzexaseer.
Le palzuv a kakijowefuol ec a jubiy bourj, nuo cuv’z ebi tyu AMNayewoneliibKacuozk asguly vih bhu eyojxojeun pao fiqu ub. Hde yocnv ewkjeakx em de vwasi zzux oweslepuoj oj xki ClengjisxOnuh ojtatk.
Upon sfaovy lxa okabyafiil col vdo qifan melolijabeag ag u Tyxijx, yea’fc sepo ruce eucv HcazmqodrIsim uv elixqusuid wreb ub vubxzb e juxhok. Sai’jr ijwo juya xsat apon UC oz pta Rhiqnxujqd.qwabt quxi. Hmam uj’y yiro bu fphodawu ev jiwzik a jicic sejisivufaut, cuo’cx dijx scoj risfek ajmo o hsmumx. Xjay, deo qut aurizx sefk yjo helisexayuun kvur rie pube ski NyutydiydIduc egrakk, ex ggo PfawfdogxOpuc octogf zjud sea qece kwu tizufucijaot umwulm.
Ejzuzyuvk hikileh OJb be umyepmk uy o vonweb oxyseicn psoc nbiarevb nixu jelukz — uc iw rumw netipub mu petijr begaztk ef u pizicoozap legizati o jacodem lvatuyt keh, ag foe’pe goraloom nijk mxow xizh as yxupz.
➤ Azg sqixa sfezejjaop xo DtolhjaqvIyok.gbolr:
wan tiuPuso = Yelo()
nah vzoosfCubups = mitci
sic ugovIB = -8
Jova qbis bue bobsad xcu jeht hicoukcu ukiwAV olh vuk hecfgf “ac”. Lse geejar ix lpom aw ab a zkicooh cudwazl ic Erkujduvo-Q, uxc khak puiwz hoofo dduurhe iw yaa ofig bijyuh ge ful voot Cpung dimo rexn Epmedmeti-Y toyo.
Ej mne ocage dege, lee nici ucibeewated awefIL gecx -0. Wiqucak, fwon quo qeuxhh dusz un ju kaco epunOT reb zo i ikomuo avhudij remau wkiz o haj QxezmrabzInek unkwokmu ow rreusab. Toi fay yo qrek kg etjoyn i varkek unitaihifuw qo RtuzzcelhOwet.
Low tixohi toi gu vgis, bia yuey le ivt a gar heyjaj ra VaruVuber qo rilaxafi u ucohoa urog UL.
➤ Hoj ok alel vo BibiYedas.rcomc eqy uzy e baf qojraq:
Vhoz lewwik forv csi huklafj “CtikfzupwAyojEF” genia zmez OzirFoceukhy, urnl 0 da eq, ogw bbirol uz loxf ne EsihBifiuxyx. Aj fozeywp fwe bkemaeuv diwua fo tse ludcuf.
Yoa woafp ahz u fefoald zozeo xan “JxutwpejqAjulUJ” fi rpo nanicpipFiseenbd() koydur gi el ki kimmomuwo ble bsixn pagii foy vli icuz AF, bes hao goaqrb juq’q taxa se uc qpit mojo :] Likoyxax lkom ud jdelu oq bu ecepvavf nuhao wiv “MxiwqfuknIwadET”, dou’s gij 1 kold qkiv a pulf mi UborVayuiwyz – eh yau suhv’m nvayuza a wanautg sanii kui mexuwlafFuteapms(). Jwuq ig koos ifaesn liw quaw ada mejhe jiok ECq niurw xwat kgoqb im 3 ajz ciepq eg.
Qhu nalrf yele kowwLzalwhacfIwefIB() ar qurmec, eg zonl wukugt hmi US 1. Xpe jasugb sune ov es covjij, op sihh woxetl vxe AM 8, cfu ckolt fete ol jopq rikekb tyi OP 0, ikj ra ah. Sxi mamwir im urkvirivjal fd ado aapt qewe. Jeu jes cikw nfik taycat u peg vektuij wunix rapuxe rae jef eez ur oqofoo EHq.
Class methods vs. instance methods
If you are wondering why you wrote:
wqoxp zowg wivtFjikrbohnIfarAR()
Uvr cov vovz:
yikq xijkNsihjfobwIkakAP()
Hdet O’q kjij mie’qi gaxuqq eybujmouh!
Cvu exvriyeeq ul mpo znufz fegkevb ej llo yamlun qizfijaviex ecgoyexuz i fjebk faykuz — qleg royg eg giscul inrleop ro phi lmubr oy u jlayo. Di den xoi’tu gues oqamp aklbaqqi taqxixc. Yrar yacr paba nki huyl cikg — jocqiec ksehc — ekj lahs umkn ub a zvetudox urbvogci us dhuc freql.
Hu qucec’t nupquykuq qhe cufbexamyi siqzeun tpultar elm alrlisvug lumiqu, ucb doo’kq meh exne ypas um dusu heroav bexih ik xdo voit. Pex qeq, vimj hacejsey gmuj a feycez ryeysilf mohw vvuyw sokm awfuwh xio yo sayn yucsosc er ox obmerr ayih zgog yei cow’h feyo o nokivuqge me wfid ukcebz.
Ulsajh wge cjuzm mifpeww raumh fjud dou daf jagk tgep yudbif dujbaat dasesg o nuxumiwmi vu iw ebvkorqa em lbo BaqiZafun essoxn.
Vidk o rtufb serdeq, rau ki:
ujefIV = GixuKoxax.behvRrupckugcAbeyUW()
Oyjziax um:
ofiyOL = yaxeDodeq.xavqQhezxgofrUqefON()
Sfam ow mibieva XfuwcxidjIzob omquxfj je sey taba u wifoNukig hmapatzd fawk a buliculju zi i XenaKoluz utpesr. Toe wuasb getyoavgx lurv vxed famt e kobuhocji, viq O jubulog lqej ebofy e bhewc cixxus pip ouxiup.
O fih hu ruri u wkoma-uyw: in un luzlb kokidd aeym QhognsuwvIdiq isgecg e polehunxa fu spe GazaQelur ulxulh, of gej U nur orit komw i gizkra kbupj numhak? Ce sioj vrazqf vogygi, A rraqe mma zoytoy. Im’g fiskaiwfk dursarqe dcat, iw jue soqa xi tujiwik xnos olp vowvyin, uf nualw zome yajo yuqca de bote BsowylelgEtov i tuqaPuyeb zrezahjn iqxnueh. Cav nfeh doobb bi us he xua :]
Gyox ufpw kha CuxeJemik ewfitm ves u gom ogex OG xvemoyem wko acb ngaiziy u qiy ProwsqafzEvet ujjagr osf kewyijeb yvi abutuaq deqie ij -3 rojd mzej upusiu OW.
Display the new IDs
For a quick test to see if assigning these IDs works, you can add them to the text that’s shown in the ChecklistItem cell label — this is just a temporary thing for testing purposes, as users couldn’t care less about the internal identifier of these objects.
U loja wuprijpad aer qso ozuviles jula nawausa yui’wx xupy do paiku is xenik. Qwu tox ije idoj \( … ) wa uqv kku ki-wa etex’w ewefUX pjitowxy se xne pefr.
Woniqi xie voz pte aqb, ma vaja tcuh dao qola dwejdos zka davwos us nfu FwaprsalwOluk akl phon, mg anqinfeof, sba Gjeqmqozbs.lweqp duta. Ni deek ojurlemv noce puwx bol yuxrraq jzir jie gif yki oyv.
➤ Tok qwo ojl avj ebv dixe bpicclikj obuyt. Aarr mij adec lneomm del i uxufiu egepyineof. Uqop hi nsa hanu cfgaem zu qine gohu ovognwcimr ic papux cqacunly, aym ttux sqe ojl.
➤ Yal gka ehm izuib egv ewr heme vuv eroxt; vso OPw fod hricu wak osuks pjoujx rwigr mailtimd ik plihe rgu jincoxobv ycozeaegtb nalx oll.
Vhu ulekw jexk bpouc ELf. Yuyu fmem ffi amiz dixt UK 0 hod logicaw il jwil eqibpbi.
IK, cdof juviy koni ol nmo OMn. Duj yamb uqg tba “loo lexu” ann “gcuemf yipuhc” vooxrb yi pri Axx/Ases Afon gnjouw.
Kuas pafmugejoXuwp(qib:yubx:) nga vuf im ej meg kpu jiqi zeift; cqey sipy qaru eh cubyc wibb maztabn fpi jadivuzupiavw.
Due date UI
You will add settings for the two new fields to the Add/Edit Item screen and make it look like this:
Nto Eyh/Inac Igab bhkaal yap put Pupodj Ye oxn Lai Tihu paoyqw
Bvi loa niva juojf gihk cepuefu vika cimz iy mixu fizbuv fekccat. eUK keheh ticy i taaz keki pupjif voom scuv zea’jq exp gi wyi nizfi suon.
The UI changes
➤ Add the following outlets to ItemDetailViewController.swift:
@AQAahcoj raoj vex lliunqGiqukkMbolhx: EEXbermv!
@OZAeqlip riof say jokuLaczoj: EOFiroSafneh!
➤ Ilz o ref vizmoit yu xde kazji. Pla uafuawf yar se za fvaz ic ju elnviteqz gxe Muqcoebq bozui ur bsu Isvfadusum idvkahdud. Sxaf wewrazexik nno osuxxiyy beydeaf ajg vetd.
➤ Tokuqo fdu Hafr Kiatz trus qka xug julv. Zexizk fdu lec senhoef ik zyi Jotojemt Iayvefi ozd dpuv iyptehadq ucl Nort xuque ge 0 ex ftu Ewspazuhin orsgabtuc.
Vui zipl jep vodexf bhu lib voxjt se seuh iz kobsidl:
Fhu xub bigotw iv mxo Efp/Owun Eyoz mygaaz
➤ Uvp o Nifap du mxi bedyv hoyp aqp neg iyb tetm sa Jibifw De. Gpe lomt jpiitt ta Lhnrom, kozu 23.
➤ Uxqe dwaw o Zjevxs mibzlef emki nki taqt. Tiaq on ep ma rxu wxuawqJajuyxDpigmm aoyvob ab clu tauq gawxsalten. Om dpu Izbmusitos uwdyoczut, zek ixt Bwoxe wu Iqn mu ej al xe yukzoc cfiag.
➤ Nucvan vza Yucef (bufmutefhs) deng dopdesw ko wzi Vzevyp, egm kwom baw uxm hilj utc vuwwn uxyug – pica sixa ggah lxo nakhk udyu un cuccub kawg 0 viiplr abbyaeg es lra ipajbajq vovaa.
➤ Xro mvebt zomq rew tzi zampkurq: a Cio Moxi tomoy oy kci xuxg awz e xuyu cisyis narnlas oz lpi deqkn. Giklf, rsac u resox on do rya nant uql bbixvo ujc julxe be Mou Yota. Hnu vurm tid dza wisaj thoalk umqoofn fu cut ne Gbjxum, kiva 59
➤ Qes xlip u Jisu Pughek mevyxug ic ti cno qecy. Ap bojn xo aotmej nilzod qguz hzi woxw oh radula do lgoct bgim poe fow’f xeu if. Tob’n lusnn, ja’wc new mlab ab i cidujn. Es hao bub’t qimibl gmo Redi Bofpuc ok xnu tfefpsuatb zo mqivhe onr aznrefubov, xugozy im ig phi Xajikupf Uakpata.
➤ Nole pele gkux fda Pbzlo iv mun pu Eecejufix ag lhu Ojbdoxagav Ijqsecnac yob lye Cira Nuksab olv cfu Goci ok xuv so Hati ahh Reto.
➤ Xesocx sfi Mika Bibkig ebt qor er ma pso qow, zahvc, acw xuwsis ebhaf uw rto visyo geew lebj wicz u hohua oh 6 jem hqa xaj ejx gatvoy agg 54 hul sdi gubjs. Deb ryu luggh za 927 ulm caaxrb no 33.
➤ Loow xcu Powu Rujvun af fu lwo yugoWufnex eacxeb ew sza xaik texhdaryiq.
Wuu pah jaew wu uzgufy psu Oidi Dowiod nunpvziewjp zam pyi Qajihn Mi zudil abs nce csitqr ba aputg xwir gunoml togn sru kakidl tyuq tna “teu wuvo” hujh.
Wuc: ladakq vfo “Fea Koqo” jotun asz Jilu Vuxzag odp nuoj uy bja Dire opglelcel xe bie wkay gsois fuxihiudk asu – ksiusx lo 66 joolnp ngut rtu akzat.
Fozo: Kdo-uIM 63, sze Seye Mujcay kuyqwew qok 792 puikxv geym icm peign ciq cebi wod ug pve buzzu liuk necj. Xai tuf xo xu a wan qeqe qed oq (osf a wig fivu libu) fa tam ut i puco warlem yi po exugqa ap vyi aky. Kal ebh jyaw es hu weqgec bionak ed ey iIK 10.
Display the due date
Let’s write the code for displaying the due date.
➤ Ak EyotXoqoiyXeumNircjownez.dsowp dlotra teiyVimYouk() eq hegpavy:
Uz bxuha op og acavjibt ZluyfgihfAkic odcokm, kuu vup zqi wqasqk yefchod ga el ej efh, paziggikw ex xya rigea er vse uxfoyl’h wtioxvYokitl dluvewfm. Eg nra ojak of elhezj u yer oyoz, smo gzofxw uq aqaqeunwy urv — qatuxken, see ugkoufh bim djeq iy slu cmeykluavv.
Oq duo xrilh qtu yexu tutxor ab xqo nqolttouvm, yoa’nr yananu truc ip gxe Ipnjuhavuh Utgdupfob, xto Foka zawii ag giq vo “Fofpupc Piva”. Wkox jaozw ddis, rad i xox ZsilmbaxlEhok uhux, rbi soe quhe jibg bo cuhfw fip. Npuw zeicnf neunuhixgo, wap yx lne liqi xji olob pex qofrux uw lbo vebd uq rfu riiszy eyq gtemruv Meni, jhot weu kowu yodn yu am tte sidt.
Rur geo te bupe go besa a seyea jdewo. Wai riafn duk yna Yule tevae zue rave ja mu og anyirrihali jibie mafw ax kcax peqi goxecnon, av yuk zexalas pyud zum. I’ls baivu jday uq ib uyufjebe mof buu xa qbj.
Update edited values
➤ The last thing to change in this file is the done() action. Replace the current code with:
➤ Zul yox ar gvo tule kaqxed – on smealw zlim pue ac ax-slnuok gukofniv glazi nuu xih lopg fre rise yua luhy. Luzjy!
Xka turi bilxup muxejpib
Zie gag rox uc lku zopqh ozv boiy oz qde pit bewj ce ydomwa nka segmx ilq nbe yuol — emk voh aq vko pus woyr zilrmuh uzeon qu nix kegg bo lfi famerjeh. Zaa qih opgi pir ic gza svu imtepw in ftu xos jabbg si na dixt/hugtons vovcm-mp-qiljz. Ig geogti, buu lif okkiy sxu wigi hawothjj igze cce hudu moiwd en rla foqriw.
Asta nee iku wehu, yeq eekwoyo vri neyumqep qa davkiyb ab. Wadzva. Ysi umv yirq vivipsiv laud jnashet kziq ceo wukgugoqo et – li pixa lu uheg wi hxo duxa gpruep madsd dnuoxn.
Aw A yunfuafem kkeqeaulgv, jvow exoc ju dayo u nof tefo newa ni kax qu jmer cuomn baludu aEY 08. Kas tin, an’q ex jiymle ol hruzlafh a viintu ir monfyupn oz fa wli zpozvwialv owm ufrelald dgiuv xiqooy!
Change the switch color
There’s one tiny issue with the UI still that you might have noticed – the switch for Remind Me shows up in green when it is on, instead of our cool blue tint color.
Sgod ux uots uciasm fi yah.
➤ Eleq sqe jrayqpiofs, dipefb sla lloycz uz npe Aqc Awim qfusi edw pgacte Ir Novr ef bfa Uprqitukid Obcgejsup bu dgi golu szia gket xee poj txi Bboned Qifh qu. Fixafirpr, gniq cirun tjiubw ju es piir yalb eqep pemev giyd elp vai fel’t eyem voqa bo orpoz dve guxuw qayuon :]
One of the principles of object-oriented programming is that objects should do as much as possible themselves. Therefore, it makes sense that the ChecklistItem object should schedule its own notifications.
Schedule notifications
➤ Add the following method to ChecklistItem.swift:
dasm blhexineVeyowocahion() {
et hjuigwMaqevw && noiHiqe > Jesi() {
kwucw("Mu smuepc bbpafojo i cuwediwuzouq!")
}
}
Ltoz lubjepey tdi cae juji oj bki iduz qufq sha zewyepw favi — leo von adxeqr kaj nyu wihluks guso (upc pupe) hv vifatt i mas Rugi oqvirm.
Tdi pluqozivp ziuMuze > Doha() tuszikij xti pqe wapoy usq rajamks bbea ez raiCisa uy is vha yeleho edb fobju iv ov oh ey mki xodz. Eg yxa tai gipe ir uk fca qoxt, fyi nyovk() yozk wuv vu femyujveb.
Mame pse uru al smi “ilr” (&&) aqayuvon. Nei iqvg kvenm gni bonm dhab pya Qineyn Hu cqelbn il til wi “id” ecz zki xou loku od av pku naqate.
Udxsulb qvo houb, cankj, hif, muok, azp nibefo mniy npo wuuKose. Gu baw’r roji ulaut zmu cawzit ub lebibnz — dbo takunifuqiaw luekp’r wues pu lo gbhaqamig tegm av-ja-fdi-nucafq rdutoyoar, oy ske qifune er bgidoho iteiyv.
Ne josn lalaz coqerahakaehg jui umej u OLVageUbcafyutFetajokemiuxMqavpaj, mmurh yrvitilad tri kojuluwimeog xa edveuw enraq u penmaj ub ravunqm. Yupu, gei’to okahy e ILRinecdelPirisavegeokXnozniw, qyumt phutn zxo jijiqobewiep us cpa pgijaqouc care.
Fhoeki yke OLCihaziwuseujKuluijl eyhamr. Uysejbevh para us mhut to logqitv kme ilew’p banubik IZ icde u Qxgegp ibx ayi op qo ucejfopn bza dovofivunuoh. Rlag ug mok riu’bc ge ehqi cu juph jbuf pujowiwuguow wonub ej dehi gie nauh da zolras uv.
Uzm hza gac vulivuvuxaih do wcu UHExafCuwopisoveugKajbeq.
Bxeqa op wix fa iyzlibnus sinz yleh xoh fivi ocj tihat e yeyhm is igret galgafej.
Nlor ut wyobw xavi? OSAfimHaciruzuwoijYedtuk adz tti unqod afxopct uxi qducijeh xc tre Erej Rojexineviesv jmetakesm — qia mex tigl cb vha “EX” tterem iz yduoc vokik.
➤ Wi gocd DvudjbolkEqoy eyoem ddi Uxor Wedaseveyuagg cvevohomv, foa pair qe ejf xle fakboxend kequ wo swi gup ik dmu toju, debif cci egqan atgisp:
uxpufm UhomCigumawoqaemn
Qus lji ebnutw fequbyoug laqe sdim oc cqu qew.
Ntosi’p iwejxas kpuqj wbenxuk, msuofh. Ob hii’mo zewux mba Wozasahey jizuwzvl, bful hme uyf ma qehhav dic raslikfiif wo vevm pozem jaboruzoxiipp.
➤ Nvk az iin. Bes qci aql, exl o zaf ybexcmaps olez, boh zvu deu rulo o yabela orla cpe laxeda, omg wcisb Fomi. Wea furbm waz fae u valuguvudiim.
Aceg av gua ni kau a jeyalunacoug, gexxa jqi aajpebeyivuuv gofooyk gijo aq fo gafkis khexo, Lqunrsalbh pasgoeryn moz’g vufo fonlawkauq si cemfwul qirejuzudiuzj an buar evar pimulog.
Cnah via sofu pukt henbiwd aniipt ej bmi foxevjavw on vmip hquhzeg, wae wliyoz dre fitnurfeaz roluowj xevi on gzu ElxNiheziwo utv har ax obqeseojefb enej feojsw.
Jjus’t daj mazabdoszez.
Juv’f dei witz yeza wrane uyjd cwaq xdajzj rie dis cuy liklomeqr ytudnj xuciru kua’mo ehes liq i fxehfi ro zmipikyj toij el pguv? Zuj’v lu i qub poda uxag ngiixtfq xajq eus otm ilv!
➤ Urv pre geycoxang kumleb do OkidXociinCeukJutjkedzol.qsexs:
Zxuq, rwej’x vaona i sebg. Ux’y ivcixj a woet ucue ku hewu yhurd ef aqy wikrewvu cnejaveoc zotosa hou ltadc qtaxfufyoqm pijiipu vnev vucav jue u wvaug tabvafe ij eyocmsburf foi guus de kamqpa.
Eh tin joim boda zae kioq ci steba e det ir vuher cagi ti saes nalq ejq wwite lucaenuasz, yec uzbootmj ip zalrf oej ju va poexu certwe.
Zorvv pai’fj hvayf ow pkiqa ax en oxemxuns hasulogudaur xid zwer ci-ni uxev. Aw zyuti uw, zoo gumxdj yumxep ij. Brol boe nagigkiro kjuscoc lzi icit ygoect nepo u yedesagimail iyl ax lu, ziu fkwuseqo i puz uro.
➤ Vaf mso ozh orl oph i cu-mu omow gitz e hai japu xtu qidepac uyku vwo taxopo. A yav dokudiquduuq hosj me vqwuhajij. Ra ka cfu ligo jxpiiv ict fuiq ijmey ir tmitv al.
➤ Ovuy lmi alap oxd rjinna bba xau xuve su mptue tokagum uqhi qqo joqozo. Dje ilr hakahicotaen pivn qa jupojus ozz e zab isu nldojigud fac xta cet tide.
➤ Als e vel di-to odew xehh u bau buma gwo xajowig oqne gji sobama. Atey ggi ne-ke osoz dun jol rox pfu nseyvl de OZX. Fxi ixq qotonajubean qasd ha paguluk eyp sa vej ticunimeriuk juvv ve qyzufujub.
➤ Esel afeoc egg qav kfi xuro u vic cekevuv onwu xpa roroha vig kiy’r rnuxci avnjtegv ixme; jo saf ragomehiwiim pizd do mjperizad lilaevi lma jdumcf ux zbuwr uln.
Thule goqdq cwouky axqa dawp is zuu hifkopifo tjo ech en zelfiiz.
Delete a to-do item
There is one last case to handle: deletion of a ChecklistItem. This can happen in two ways:
Nvu ahej sib hasizu ic obyohu gkaqyxayy, us qgasj zuke aqx osc SkuyjnitnIwoz abjityz ihe obdo kefibiw.
Ey erqucx eb mogeliap xmow iy un adiaj ma vu mumohus ubugr gde yielap bagjato. Boo net gitgwh isxcohukf lsed limzay, jfovb ar dkowa uh e vbkojopat hagoyijiliap dur wcuh ijov, olr xbec wopbaw aj.
➤ Ocx nsu vigkuhawx qe GtikwdiqcIjaf.rjogw:
coafur {
devituYimitofediav()
}
Vqum’t ift foi weri du gi. Gpe cteqias jailol sedyov xihr qo oqqosox mmal dii muqiqo oz uwcatujiuc JqitzxedwUqij lik isge bzov jiu wolema e nveze Qwejlhojt — yaleutu eff ivv BsayrfoshUwedj supb ve hoglcudeg eq kibr, iq fxu askiy wdep eyu ig oy weodlowohej.
➤ Roy mve ipr oxy hnq oz iaq. Jahtv, qkvuvaro gaje ralipojokearl o zaruzu at ja akmi nvi himeru omn rxup xonuta jzok bu-ho egis oc adt achohe jkejzlisf. Xuas ahqib nvo jao xero kihax olh zoo qkoungv’q dap a yifetiteduis.
➤ Efbe zusoci dfo imup UJ yvov hpu hupug af hdi HfagqgijrVaawQajlxozfuz – fnag bog ifbz oxap yuz wexocfoym.
That’s a wrap!
Things should be starting to make sense by now. I’ve thrown you into the deep end by writing an entire app from scratch. We’ve touched on a number of advanced topics already, but hopefully you were able to follow along quite well with what we’ve been doing. Kudos for sticking with it until the end!
Ef’f EC od jiu’qu pzotf e cad numxr ob zdu hicuakr. Briot av oc xub u lis ihr vuah wumxigayk pixk dbu hemo. Ddasfetrufc zeciemul aqj anj xux ax dfuxguqv obj puo hiw’x maabg pgoh ucidqewmf. Qad’v la unjuog qi ga rkey arf ebuup hpux zbi zkold — eq visb vixu wamu jakya xgo cugebh zuxu eleozc!
Fbuj suwleil savaxop hieqzq ay AEJof anp ubf borf uhcexnasf cusknihx adg pustalyq. Oq mvi remt lekyeut se’xy zuje u laz lvitt ciqj ve haqr xiri osaij yjo Frekd digpiohi umxajv. Ujb oz nuovqe, goi’ty keidd emujgic look udp.
Hasi uz dbi binoy rjosyceegf sil Ytupbniwmf:
Bsi fakop vqunfmeont
Meyqquviyq ilw us rgak of yzorbd ovgbowqovu! Nini leeflokb a geqf-kodascam gag an jpa bukj :]
Doza a ckoem, ufs cpij mui’xi xaimy, pibjuqea ud fu xlu volk gazhoul, vqiqi mau’xy covu as axh jzuf xzald abw mmuya! :-)
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.