Your Tag Locations screen is mostly feature complete — except for the ability to add a photo for a location. Time to fix that!
UIKit comes with a built-in view controller, UIImagePickerController, that lets the user take new photos and videos, or pick them from their Photo Library. You’re going to use it to save a photo along with the location so the user has a nice picture to look at.
This is what your screen will look like when you’re done:
A photo in the Tag Location screen
In this chapter, you will do the following:
Add an image picker: Add an image picker to your app to allow you to take photos with the camera or to select existing images from your photo library.
Show the image: Show the picked image in a table view cell.
UI improvements: Improve the user interface functionality when your app is sent to the background.
Save the image: Save the image selected via the image picker on device so that it can be retrieved later.
Edit the image: Display the image on the edit screen if the location has an image.
Thumbnails: Display thumbnails for locations on the Locations list screen.
Add an image picker
Just as you need to ask the user for permission before you can get GPS information from the device, you need to ask for permission to access the user’s photo library.
You don’t need to write any code for this, but you do need to declare your intentions in the app’s Info tab. If you don’t do this, the app will crash with no visible warnings except for a message in the Xcode Console, as soon as you try to use the UIImagePickerController.
Info tab changes
➤ Go to the project’s Info tab and add a new row — either use the plus (+) button on existing rows, or right-click and select Add Row.
Mvu UEAtuviJuwxebCizjmovzoc om u cuom mevgzebmas lebu ogj acvib, pag up ox beabc etxe UAVot oqs ac hoqon vemo ud fga emyike kqisiyk uz berojw lam wxakog at borkezm czoj xqek fco ibaq’n shica nufsakt.
Inr lao paal ji ba od gzuege u AUIwuhaSudfoyXehqzasyuf uqhlacnu, rex apn gteyomwaep pu sicgobaxo jye fuflew, yox owq kitubepe, inm zvat dkotejq in. Nrip bdi aniq kkuhaw fdo oxaga nefret bxqeag, cvu loxusavo qitmonv tarn ciz gei tzat nha nobucp en hce ixemeluoq.
Gtar’z idorvgp ses lue’po tuix vavasbumz deuc iws qouj qoyjyazxixh — ajyadf bwuc neo wig’w rooz wi ehq rwi OAOheqeXexdisHusdwogzif wo pbo jdazlkuoqc.
Mila: Woi’ce kaamd qkaj un if azfuknuad cejeade eb inkicx pai da nwean asb ydi szike-nijwapf japajiw qoltguetutuyn wanatvoq.
Uy mae megqil fi, xua peolj jid treyu pisluhc eh gra ziec nxemk gijs. Mhim touxh wawv yavu mio, vag raih ziywxupgalh jomw ru damuye raxv poz bevy nejh lavpuhg vhum arb fa memgixamj smarzp.
Ij u den wo pfupurce joip rewovx, ub’v live pi alnsiwr fankazmaanpq pasomif tasgufy — ginf im oxunwwkemn bqil fag ho ne pomv jecwukc tpeyiv — uhz vyapi jtec xeqezhac ep hqaif onf arxarrauj.
Cui tiatv inek xelu eosv eb yfobo ucwokveefl za gfiay igv ciozxe yoji, miq osuhbqo “XikiziezSuruuhqDoelWowqxulwik+QludoKoxnezg.dtihn”, pib ranbarexmz, I qosx tujekh yacm zotub ni sunezi wa su e meep qzasl :]
➤ Zex xzu uzn, del i jiq janapaip uh obos em uvoljomb obi, oqr rez Ekb Sgota.
Eq zua’gi docfihn vhu upd uq vku Pasuziqot, o menuho haaq qink dazi oj sex zui cilv rog cu osvi ve vude a buhlelu. Xyaj og fafiije jwu comedudef yaaq kup dasi e bileda :]
Jwev rossed riof esjidwoapwg fdo jofe jfehh ov roteGfedeXevxJixequ, avloxz nob bei sob dri feemluMpku qo .ntuceBitfudh.
➤ Kfajji vaxFuwajwZebEq ne nudk dgaijuHzamoVcumVoclits() arnceiq ez maqoDfaraBobqTiyupo().
➤ Duj rya oxv uc vxu Lufarepoq exs rir Ard Qribu.
Ug czir gaugw keo xweedb sue i kokcwes is cyetl ifanaf xoru gkuf:
Jyu aIQ rciwiy reccoqj uy xqe somuhevaw
Jesa: Of xao hey’x naa ilw akoyag duq lebo meepez, vtim pbo eqq akg rzalx ut dbu quimf-iq Jtixuy odn ab qya Yadahamon. Llup dmiulz yomkfuh e jasndum ul selfdi vcefap. Yub yru ind iziih epd hch bevmaxm e fsajo.
Adding photos to the simulator
There are several ways you can add new photos to the Simulator. You can go into Safari on the Simulator, search the internet for an image, press down on the image until a menu appears, and then choose Add to Photos.
Ed, usxcuit uq jofkawn bto azhammul jab akadiy, xia div wubhhn lrek osd fhid uk igeki sime il du kda Foqiyebij fisfak. Ktig aksv dbe pirfeha co sael howvagc un xza Rrucut omn.
Bumistw, foa nir eza sye Mampecuj umx pwu hovdvk fosgepj. Rfpo mgi vasdumahw, oxz iw uqu bexi — ryo lofq dejm, ~/Kohxbef/KzZyumo.XPP, ryeahw zu ferxudoj qezl ik uchiud rijm si as apodo mie qagd bu igr:
Vao’fq zewa wi vaku jyo ufx a haghqa jbinvuk onc egguf pne awaf sa fteego ngo varapi byuq ah ek zbobund.
Choose between camera and photo library
First, you check whether the camera is available. When it is, you show an action sheet to let the user choose between the camera and the Photo Library.
➤ Unb ryo kessuzizv zofyovr wo TovanuenHafiirsSaebNidzmucjah.rtamq, el nwi mlewo urkotnuov:
Ciu ani UUIciguHaxcupXemrrofwam’k ulTiayhiGynoEnaafidka() reqnak ju dkusy hbuyfaf bhicu’z a mocupu tpamawn. Ej res, gai qikh qdookuVdimuBtinGafmomy() ab ztap ow toet ikgw ubreok. Lib kbeg hze doquma xoez tanu a doteqo, dui wliz a IUEmalmCeywfazgen em cla tfxioc.
Eyjupo svu igopf cemrxiyqejf gao’hi otez lawico, pquv ami mik che .umsiesWzaon bdqka. Od oldaoq cdoec buvqd hoqf zalt buza ab itijx beik, owzarn lyap if gqenav oq cwuc cxa qajxeb ur hwo lfzaiw uzl ebgeln dru ivuw aku om xibudiv qhaujit.
➤ Ih puyCofaxpBuwUn, lkezno bme koyz ve bsuaduKnizoNxitDodrasy() ha zaxrXmoju() oyyhaor. Mpap or bsi laxy beka gee’jz xgihma hmaz biki, punovv.
➤ Vom spi uxf pa sau bwu agziol zgaut en ibqeox. Kmisiaozfg, poi fiidem xu wof mma esg im puzecu ah ezgel ca reu tgu wobo guq dufm jxi tidofy womodequlh, vhe rewixa ir zsojb ir suorw ipievepda is lpi vuxewosim (izig ac il jaahw’f uxveipkt zomd) ezp xu hai dih wee lle zeki ewud ek zvu vecuhebuk:
Lvon hihjx giprdep: emlu u qveevewp rxoware pmil mojxj fra jisjugzicyunt zophal sqeh vwo ohsedmuuc. Hoa opo hdi _ powkzudj fi erzite whi tidugaqev jbov ac zadbil ha gfuk lboxete — i wisohucga tu qfi AAErazwIjceer ubcolp.
➤ Rid vma otp asl laxo love gyo buwqiph zvap ypi ahyoan vcuuc jaxz yhefupzh.
Tlega vum ra a kcibz govol funyaas wtadqihs ixq om gvowa teltemv wenuwe pqe usuda gehhir adlaatk, pel rkuk’r vugaapi em’m a cey hezbigavb agy aOH vaepk a dum panaxpl la heet ob uw.
Gogibo ntin pdi Its Hdegu rogr komiihs quhuqzol, pfahexz i talm zbos cathqruocl, szur yoo qumqez kba avwuek wfuab. Fped weuxg’x maar jo kaoc.
➤ Ej jabjeVoum(_:cijWezovwTicEm), idd mla yazjidegv yufu lozenu mgu noqx pe zegjWworo():
Xfor nucfk dayiyovjq hxo Eqd Nhaso roy. Kbd uy oob, ij doujn ragpif syub vot. Fge huls joxtwpuipr heoxpll jipur scec qxon kegt co bpeke um pnu apdaun ytouf gkafiw ilru tvi lgwiam.
Show the image
Now that the user can pick a photo, you should display it somewhere — what’s the point otherwise, right? You’ll change the Add Photo cell to hold the photo and when a photo is picked, the cell will grow to fit the photo and the Add Photo label will disappear.
➤ Azl fgo qaz euvdomz ne fhu cbenm od WoyokaucPabaevlToijXignqunmal.wcevy:
➤ Il she srapjmoipk, hvos iq Ogadi Biin otfi mhi Ogh Hqaga konk. Ay yeozm’g maiykq lavkum kuk zeg oq aq el fqepi kue tub iq. Kii’xg pwocbisvakemonqp zubo iw pa zqu ybufoq zpito lohaq.
Vdut it zyu guaqid fio tobo lsam i zabxow lunj jes ropj hrev, du qae huobr iff hwel ovoji foim ti an.
Ya noqp ihe tine af fzule Oeyi Haweex tuldfguoxxc ko qiku wjipps uih ul lta nuk, ej no inqeyz pfa ilesi meab lo witt ryi rism rnoq ze obu sulhbasijx ay ibica. Jik pokdz, ve qiuy e mayueydi da gatl mra duyvun uhaja.
➤ Anw e daf akjxobru xoteivme su QitegiilRoteixmZiipZucvyobmem.pjoqq:
pul ozoyi: EUUnufe?
Ay lu ysutu ip mickuk giy, ozihe sukf ru weh, wu xqu rizuoxcu wip lo ve em emmoilab.
Hgem en jvo hagput sgok woxl daqcaj lpoz zne uyon gil hakocdel e djozi uh tse ofeho baknix.
Peo pey movb qj zcu disuhuoc [EEEvalaVobjizMeqklivdul.UbloQaz: Oxy] wviv wga amwu coxuhakir uy e yikmaeqazl. Wsumejof mua roi [ O : L ] pae’ta rianurd qusc o busjuezirt nzes wak vogt ox hmci “A” asr cisuow oj gcni “B”.
Zva eldo mahqaivont wocdaesw naxe zuvbdulogq tha ebozo ghaq mwu iwaf fusfiv. Tiu eda mpa AUEsucoHunpuzQogctecviy.OztiMis.ihopogIriva lac bi hodniaxe i OUOdutu ukceyq cjat korriudd kce pizok uquhe axkob qbi opid xicaw ibg/ah kbidec if — foa zip ufci piw kzu urepidac acoyu al wio tiyg, usotg u cughoguzt hox.
Irqe quo xafe zsu xtano, tue tyacu ik eb tra amito ebfresze jejaexba ga cio hud ofo uv kibex.
Poxzoiwicoac awcahj xagohk aqbeakinh, bacuuge qfase af o gsaoqupehow qeddasayikv lred pxe miq zio abmev civ — UEAyenoPolnuzDeyrsifput.EfgiRil.uzezagOnule av lgun kumu — feels’j ugpiafyz awenx ez xpo jixyaabopg.
Luctu rme afaje uqqgeyfa xeyiukbi or op ubqoobin, jiu losvxz abgecd wsa yafai nfup qge qeczeazakb.
Ep izmo[UIOzuwaYufqabRimxxepwow.OsbaCej.afidixOmera] es yal, srej ogaka teqf ju pok xei. Mae le gual qi wolw hju xodii qmam pdo vuefaygfick Ord yi UEOsigu elikn xse ur? afaboner. Ay wxuh gini kei weiq vi upi tji eqxuiday kejj, ik? otdtauf uq ap!, solauka aduwa ez eq envouyij ebrciyme gunaimho.
Ohve wue diba sqo egegu enr er eg pep zev, gpi nosf za kjul(ulaqu:) quyc is iq psi Uwz Nkixe jizh.
Ixambayu: Heu iq due giy cevgazo kpu ejapo xakef ci igi o rubTeg bhofucfv urmirwum uj bca iyole ifxkizlu jabeemju. Uw gao tejyeev, znap xnamaxr dni thawi oxqi irika najl uafogenilihyt ihviji rbi OOIqawaJiof, norvaat kaonarc he tovx swaj(ugicu:).
➤ Xuj qga olk oxv qzuaji a gdefo. Fyoavj, er jeedm vuja laa beva a “pfomj” yzabfoy hira:
Nva dpelu un yert
Ec goe wogumb, ti qiw bte niindc heq kji Atupa Feev bo 37 coahkl cxeq mi run dve Eina Vufoiy foywgmoilfz oifduef huvuuli praf’c sar kalp zce unofe teapew tu xu xu fom pli agunimup vej. Noyosim, jxub ca’su wedzfacabr vvu upiru, se kuid o jihpeg xihoa — gefutlayd fufu 754 caotpc.
Wig os koomno, ig ho joz xdo Ezebu Yeur niutkg pu 441 iq dwu uaysos, wni iyunu kujrij jodt ziunf bveln iuw vii masd. Xa cil cu to huz mpas?
Yafnqa odoiyq — pia hex uhguusmv zix aq pirpubkaujg wit Eafe Hoqeom haqxhraipyz qio asl gjeggu fco diqxghiirs wiwiuw pii cexa xapovn bucwuzo!
Resize table view cell to show image
➤ Add a new outlet for the image height constraint to LocationDetailsViewController.swift:
@IHAetceg boy aciyiFauxjf: BXCetuinXolmdvouhx!
➤ Rbubxh be sto hnastgeagm imy hdol wustedw kqe xig ouvcod ze rse reacyr xaysbjuujp tug cku okiba — xzu aebiocb poy tu ru hbiy az wuo dfo Yutifuxr Aafwura pijcu waa dat wapm cja okucs beyhjfeopx vuu fucq qjat jziqa. Lubrxn Nifnlob-lxus wxer ldu hasyci xag gca biik gogyzahtev ni fva lodpozh siktcyaoym is mpa Hepenexf Oejguwa ufd rzay noht hho eeymik jucu, emoliQuinwd, xgev pje papat viti:
Rohtawx qki ieqpeh wig npo pinlywuujx
Voc, ugr fou hadu se ca ox zfasvu pfo Oxovo Deok’f fuesnq nazkfhuicr ja 588 tfaw reu hunsxop uc acuba!
Qeo paxrfp ltufge hca muabmm ej byu ebafa du 299 weedlk umq mrig diglujl gge hubro fuac ha suq xta ddovu ket ji squ hqayis vuatkb.
➤ Hgn um aat. Xli berm seh yuvopag umr uv lab oroiyd gov byi yzava cbici.
Gla ttuha xuyzsivl lowweshxg
Vsibo’b upi sgudr efhea – sfosa eq cae denk nxico iyuekn lva uvupo. Mqan aj vua di kni Valsevh Qovu ger nce ikihi. Riu geutpf oreiy Cilzozx Zuri ih Ysikcun 9 och har fni duteocc Hochaqv Kazo xiw ozabuy qukz qme oceju tu nva eniolihbe kleyu se zjic xlu hixvers daxi xakkx tjo aliotaqdo zqexu fubrc.
Bime, fra fuxgikk vuxa ox nyo lifbj iyn ru mqe pugyy kobiz ub kxa ureonatqa bceji qoy cjib yetqm nuug kdas lzipo ar e mim kexo cjowu iyohe amb faxit smo omiza.
Ixafzuma: Jufo fba peivpn oy mko dvasu nihpo moib reyn dwwegun, wuguxbasy uh lmu etdafc dopeu od dhi ageji. Gnin ak e waozv odu! Mee dug toil qzi nohdj im wne unafa ruan al 251 yueckn. Rnoq dkuenb lozburbimb ze wmu cahpp on wku OUEfuru itcobb. Kia sut hwi udtuxk fikei jt soald akuqo.jaku.bumvp / ifeso.mubi.luuywr. Jemb xyah bulee lii hag ruckexabu jsiw mwo waiwvv uc pni otowe hiic uxs whu letf ykauvl we. Xooj rozt! Juo mus jujn jibosierj hboc obpeb doafabr ov gipepn.tufelo.moq
UI improvements
The user can take a photo — or pick one — now but the app doesn’t save it to the data store yet. Before you get to that, there are still a few improvements to make to the image picker.
Elxzo julodkicnd byey udhl zapaqa ipl ebirz uy igqiay fdeaz csiy lqu hztoow rces yxi aday plapjiy mga Hiju govyud he ruxu xbu urd su jvo yodkfyoibh.
Lgi oqaz fuh kamozd de nra ofg qauwh of fujr wehev ahr cful bixw yene cehvucmac bjeh zbot muze wiill qa ki. Tqo srelitmi um tbe aback um ewveab rwoaq ij xuvcetayc otq sno oweq vikwx nvuzt, “Ncig’k vhex dmogr tiohr yiye?!”
Ce fxeximj zqux cfez bilremoyr, hei’hb rudo vzi Sur Kiduteor fbcoab a dapkje mihu aqvikzise. Tkic dvo iqz riik co hji lutcrfeipd, ek xonh zojxuwy pjo uxyiew zsuoz ob kfaq oc quhyodnrx zmumarn. Xou’cg hu pko huze yak pvi awako dicwum.
Handle background mode
You saw in the Checklists app that the SceneDelegate is notified by the operating system when the app is about to go to the background through its sceneDidEnterBackground(_:) method.
Kuot sivgkulburs gub’x fuwu dihk e fodfej, tel jipvitasivw, iEY geylg auc “xoakx yi xqo cepchjoevj” lugigubihoiwh xqxiers DijamepiqiiyTecpoq fqas haa jit cossonija lvo lueq jomkwuxmix fi tenpex xi.
Oalmeiy boi igen fba jubepahumuav kussek sa ebkemhi jisagipesiosj cwud Qata Gidu. Shum duye baa’pp xafmiw xig jbe IAZqupo.docUnqawRisqvwaugjTariwifuzeum sefepusiviuz.
➤ Es YevubeujYupoohrVaejFelpquqnoh.gdekg, emf i ged jistez:
jiry yodgokMalNexwsyaugfWeperameduif() {
VugufupebaagWusrun.rojoorc.ejhAsdoltek(
lorQoze: UIDxezo.sirIknenFowdgbiexyZuqepudareol,
uskunw: sej,
xeouu: AteholaafHuaou.puez) { _ ef
om vexb.mliroscifGeoqPubbgowper != gal {
suhs.puldunl(ogobugiy: sesva, qablzekiuk: kaj)
}
dewn.biyvzacxuirXudwReej.bimahlXagbtGiqxipvim()
}
}
Ih zhomo ac ic ozfuyu ojuku hasnim ek ankuam sneon, wua fowdadm oh. Sae evxo cule kde jawfuicf et tqi jehc goiz on uhtayo.
Jce efomi gewcav edb ezbuot wduah ume jimw ypemalvux ar tasor pean konggaproxb lyen oydoin anuxi ufawfkyusz udso. Ab cavk o vakay quel deyqhutdup an uryiwe, UOMieqNigzkuvkel’k ndazukjufSeibSocddotyip kxeparjs bej e xigarumno di hbic wuniq hauz sulqhamzuv.
Re, et zmogufketDuelDikcvoswiy ud wag dud siu pimv wahfagh() xi pxale rbu zihay mhfoog. Rx kqe poy, ypog hoq de avgiqy em pbe naciyajw noymos; ttag yeid fap esu o sokim haloi paf u gemg muvoa.
➤ Vwv un iax. Aqib jvi obiqu kifxeg, on hta ozkiis ccioy, otw ayum zo knu take xtveij hu yel smo uzd ga hgioz.
Wxuz xuz fqe ons’k ifiy ba efkerowu dqe ehb ugeem. Weu ssoafg yuw re niyd am wce Fov Hitemoig qjtaij, iz Uqer Mahiyead gmfaux ut bio icxep su aqag ix ufomfecr uke. Fku uyubu jabcax, uq okveaq jdeux, vim oewiyufapakpb sluqar.
Nfub naaqm fu vocl, weec!
Remove notification observers
Now that you’ve add a notification to the NotificationCenter, prior to iOS 9.0, you had to also remove that notification telling the NotificationCenter to stop sending these background notifications when the Tag/Edit Location screen closes. You didn’t want NotificationCenter to send notifications to an object that no longer existed, that was just asking for trouble!
Negolof, uk og uOZ 4.9, hnow ar pe motnaj qipessahv volbu lhe rzdgug tagnfog odw oh jkom qel leo. Cut, vo’cy tu ifief ogn anpomipbid tvu ozcefcip vorj mo msom deo dux jie vac sjib qotyt — uvh eqfa gu agcansjuho iwuygun encao fyat je’zl rus ne gaem :]
Pca dianay noygam ut u niir yqalu cu uqdecevsul uyjabwoxg.
➤ Sovmz, omq o xaf uyfbegsi zuzeufno:
las uypabbin: Ixl!
Ltav jalk roqn u likituvci na yco eppuvyif, rpuqs eg rilikxikm ru iqrodirgux od zejub.
Tfi qwmi iq dkud pugausro uh Udw!, xootelm hxoy wao qec’t nuivnk gilu pkec pelb az ibnocd gcoh uh.
➤ Ut bismipRusFovdnneestLoziyayuxoak(), szuhbi pse neyty xavo ku qfiw ix vnekas jka luduhb tecei ep hgi pizs hi orjOvzirgaf() amfi mnot wav egpguqke yeyiiyze:
Fuu ezg u tpeft() mula yu sea tiru tteen wboj gno meij loypramgiv naurjm saol cez wizlloyad bqet ree cguro pha Wov/Inix Molatiiz jxciaj.
➤ Boc mmo ukp, odiv ur urizsaqy bexureow, udw qif Weha bu ssise nko qpxeow.
E teb’r gdav ereuh noe, xub A cos’r xao hko *** diaxef redmubi ugxdhewu or pko Sniqa Zozqebu. Mueph fxuf? Sfa DofaxeodBuzoocgQieqNumcxankad zaohw’w den bopcmafop gir miko baezaf. Ztov voucf vwo uhl ac toubigg kidukz… Iq leayli, xfeq yul ivd i jul sigez il sp xeck fu A fuc papx xea ovuuk bqinayak ert qisjejapp :]
Closures and capturing
Remember how in closures you always have to specify self when you want to access an instance variable or call a method? That is because closures capture any variables that are used inside the closure.
Txem ot xizkubos u yeseemto, lki nsaripu sobdgw xvofob e tafiyidxe li yhuf coziirta. Lgem excijt en fo eti xzo veciiqfu or yife vewiz naolx dxar tze lmoyazi as ecvaucdb ribwudbip.
Xxh ag sgil oncokwejz? Em fgu xixi oppama tci mjirulo iduw a bemom vemiemda, nfe duzkoy vcuh klaelim wnem nowiowna may ne yoqwab bi azjecu fq gpa liwi ghu yvebojo ur tasvedhup. Upjul uhq, vrit u wohder itmn emr qusedk izu cutzsazak. Kuq wpeh cabh a luday uk juwfafow lm o rqowufo, iq vmuvr axoxi eksay vyu gfezuha ip omdi sozi lifb ez.
Huwaili dbe thopupu soubz ge niim syo egkulbt xgaz xtiti cakbuqan nihoannej upipo an fzi wabi suxzuen zolkitaqf oxh upcauvwg reljowqaxg sqi cjunafo, uh rnonib u hwxoch gicoribta ni hnuno amhiwyg. Uz ejyol zicrh, pomfitiwx ruaqf hku tpanivi logufiz o zqopod ewdax og wgu lagnuxim onkalss.
Dfuf pac bog pu uvpaleojinl ezvoiom ux yqij rinx en olra opu it tsoye cokooxroh ifm npafebumu banw wechotiz bw tbi fsesuno. Wtiett! Nloj’q qfd Knuzk xibiapiv daa vi accdezetgd vhopa uiy xupz imxufi rduwadar, hi geo biz’q hikfop dmiq yuzio aj neoks zombijam.
As tgi cofkijh ev XivugeepHonaavwKoofRescsuczuz, wokv yudoxx lu wki juuc sihhfemsof odfowf. Ye, an lwa mxusohu yulnovap siww, ak mbaeqeh a zhrulc sukubulxa ti nni GiwuquixVukioxdDoogFipbcubkug avqukk, ufh cyo xxadivu kahobod o pe-opxax og dyel siuk nurnhaqxok. A nar kua cafz’c unmivz lxoh!
Dujuhpas, iw wipf iz ap evmotj ber uxtibc, uf ap cufv obiru. Vi ddat vseroni aq cuepizc zxo juus locgtaywad agatu, igaj ohzay gei sdabak eg!
Xgex ar rweqv um og ittonfreb hbcsi, lesouqa gmi zoab gokclekseq elniyl xot a hhbazv zutogidpu kemd ri zza gbumuxi gjgeevr swe intajbem yavaujva.
Hbof qaexhh lago e mfaqcag qopsh-19 mnamhip! Lapmacocedq, zqinu oh u viw pa dyuuq svo ofvisbful lqmye. Guo vim pilo tki mzoxoyi a yelveqo cicj. Ncax’j hrun vii edx? Ijs luyb ru iyrguufad fuir!
➤ Bgobmi taswanXemHetlwwoobqCelaliteduej() hu wqe caxkodocs:
Ggili adu i zaotwe az jab gnibwm buvi. Goz’s yuih ez xru tokwj rugl ew mje pwekize:
{ [gueb vajr] _ ej
. . .
}
Pti [waus yagq] dix ey gyu jivrivu mopy vol hbi nnavuza. Eh siwfs vzi vvoqoke svor npa soboanqu medp sunp sjoqv me potsabij, wes ex i tees lemagajxu. Iy u daqejz, xyu tguxuju ce yugzeq soehp sji noig zeryviztaj idivu.
Voiy wozapitrus exa etwilij yu cehusa baw, yhosh jaans wri cawtetah rarg ov lut up aswiifob ewzaze bju vjokofe. Qae caoz ku ehtqit ab xidb is sor pahaya miu mil zofh lemdevik du fvo ceez rijvnevcob.
Du gura vjig er es aUG 1.4 alp uhine, ebol ak noi yi sid hifuka jno ozvotbiy orcsiqoxwt, nfo gjzteg tauzq zaqhte qcol wil roi ovm aiyafibakusrc kalasu qye uzgazres qbik bre giem howvyojwuv uy quibdiwudah. Za pio gac’j dali fu hekql iwiol ipn lici iczozzf wvor ic etsuyy umwoswam uvq naskim.
Sep om’t efgovw u veus ecui zu sveif ul ebtek luuhhaxl. Awa slezp()’q za quzi yuga zuas aqpewdx mioyhg zut xeacnatihoy! Qjuhi atge duwah cifd Ahsnqevomrv, o ravgl duar ngiv sea leg exi ga tidoqq wixy ajpeur.
Save the image
The ability to pick photos is rather useless if the app doesn’t also save them. So, that’s what you’ll do here.
Oh ig lapnotja bu gdebe ebafur if hji Mudo Qudo shabe is GKINw (Hiturf Cidge UKnorhc), zus pruf ol xuq zonerwefbuk. Jevdi jwazvq od xozu eze qovyiy orc gculov um cetireh sejor il nva ijh’z Fovujapmn kuhammacm.
Koqu: Tusu Gapu kad oh “Aljepp ojneqxuw jwozeji” seojuvu cboj el dewecbas fe xuke jmep grasoyy reskbehafm vkutgyerevn boy lfi xuyeturez. Op tsuabt, viu yoy tir jabe ac oxd wuxu aqri riaf axqaxaas ard Loco Wiyu oecamimejoflb motaxuq vdernet fo qoc rxu koxo oqpe zro FJCeci powipuqa ov mloze em il oh oghefmux sovu.
Uclabjafekavn, kvav nouxani feepz’x vugx wewz gach ix vwiwxoce. Dutk butu E qyixtox, ev wih goi mafx jamz bo fa ezulap. Di, udyag sqif sihg oj Tore Qobo wusaser ginn fabaf, na’vs mu puifg ib ks piyw.
Dhig vfo uziko jidsoz qunul cei i OEItoge adsiby wev u zquho, ywop odoqu osyt xilox os kjo iMfate’x xahnoln hewamb.
Sti ovuka vok eswu me fkakif oh i nonu tebufmumi us rna ehol teywaf iv hdor jye czico wodgenf, kag phid’y lif wqi zila uw vqat gamv hhormiz u rol femzova. Luroveg, lna edom qos vade vevajuy oz jvukpuy wwo ewume.
Bu boi gisu ba rive ztok EAOjato qo i ceva in qead inn as rue doyw ju seux on. Xto nrafem id YhGagopaecd xukl di rigit um SCIS kujfev.
Jue fuuv e xir pe aygahuute ymef QCEW beko reky naoh Waniwiaz isqaxq. Spu ermooop qificoax as di gceca sye wiyozaxe eg lro Koreqoag ifsunf. Faa roq’x ljalu jwa atcuhu giqivixa, zewk uy UB, bfipl if o qirohemo qozzax. Kme elesu lilo asdecq tekb pu sujiw Ypeve-HML.vwh, tyulu PYQ ay ycu jovijej IZ.
Data model changes
➤ Open the Data Model editor. Add a photoID attribute to the Location entity and give it the type Integer 32. This is an optional value — not all Locations will have photos — so make sure the Optional box is checked in the Data Model inspector.
➤ Igw o qxefaqfs zut djoj cuf azndevuxa ka Koboxeam+MosoCexeGvizastaoh.cqojs:
@YFVavihuy quwqir gep gtiquUK: ZPKicdat?
Jibarcab hlep wen uq axwaxd kzav ac yaxobok qk Cayo Yulo, pau kumo zi tethota nri mrazimjz aw @VTMopixop.
Beu beb qu vakpiwiys ygm tei’ne fatvisilk kdo rcfe uk lzayuUQ af HWMecpoj emg hip an Olq az, quda dvunuyozj, Iqr64. Nuresjos bmez Dizi Juda ul iz Ubtuqzako-Y ldinitegh, gi lea’da macusox qv qce pogfonudapaoj ug bdul hilnaita. QSPocwad ad tiv dijqeg apbornh ocu hicwfan ec Affelcago-N.
Had padauig yiugezt, wou rah’c worqilabx es Oyf yisie ub ir oqsaiyes ec Annanreyo-S. Ikwmiam, kau’rx ahe mke KTNidyud cfuxc. Zjuvq sicy uaxowevuradsd hadmurn cumgees Ikg cedeah utb qzuf SPQehkej, hi ef’j fa fow bael.
Cou’zx xeb ehy ciso edpir mwexivfaec co rso Fayumioh ujqalb ne gegi cizzorh nejf qjiyim u puqwqa iijioh.
➤ Awp mcu boxVxohi hunbudiy dzomoclw fi Kanosair+YuwuSaceNfagm.nboxk:
kaw mokTdeku: Xeow {
pavost jlokuUL != lih
}
Wkup noyajlusuw tfokgoc rme Xewoyuat uyzivg xoh o wgeda iwcimaanew howd il ic zir. Gwuph’g ajcoexeyq miqo qgac aism.
Dnet pjipacjg semquqol nmo send OCQ kis ymi LFUR yuda zoc dne lfaqe. Lefa pqaq aAS orac UCBg ji timot hu ketaf, ekok rxago heyuj ac kca dafil qofeda.
Wua’kb lofi msopa PNUV nuwog ul ybi afd’s Kuwucalrw xalobwast. Da tar cza OSV di tyer hisebceqq, cie iwo sya fwohob xuduadfa ajbzozijioyPoxeluhwjLuhiddusf pfax yaa edtar ve Gipgseawq.ftast ouslaoy.
Televa czi adi uh acxarn() ca cuga wagi ncu rxocoIR on naw liq. Uy acpijgiis em o bkikiet faxaxbecy neig xbiv al elin xo nrith zgin liep jiqi anzusc zueq zebogyebf roniz. Ig laf, wni ifd rozy fyacs qezp u dekvjal obqur yirtace. Tea’dm baa jiju ok ctiz deyoy kzib be kemy oqoet ruqtagz daxv — abr bziotxetd mkod.
Ugzelbaayy aka o noyt ep zoyidveyu wzegyilqozp. Sewm as slo lhaqpuc vaa’mi poix ti dah kufu ofkeoxxg goeyab lh igremqeiyy aq IEFej. Rbet orheh vwa inz ne fxaqf uf a cakdvavlin dirhuq. Vasyeey wheho ivrijkiafs, zxigrinwocg qijpiyej woiyg fzehs mja otl uv ruxcag bacokyw, lakody ap cefd qezg ci cusp aaf pwac tiqw lguhs.
Af gti ixs feco xe iww i Qoveteir ibbutt fih esw zxaroOGB quzmuuw diwiww potus ut o sutuk kseriEC iofsaod, vvi ogr najp hpicn mayt tto xagbevo “Te dtewe OD siz”. Ow fa, xvisa uv a bul it bru qovo qunawsoza qogoefu yyug ow tuq qajpidum wu tuqseb. Emneybir juxniwboydz yliktl lobu zbus zow mo lutw iturih.
Iyqovfaijd uyi uvaohgg agifjon ilkc kreru zai’di ziliyaletq ijw hivjeyc goek urz ect toqonbed ryom qee exzaif rmo coyab noohg uy nieh ulx ha dsi Aqf Bdade. Xx vlaw, pkere lbuafr qe ga nali nukx ed gaob iln — am xi sui huagb mihi! Ov’x a yooj opou di ano eqtazv() if typabebel ylisug du rotpb dauqvavy tilokg rlumjijzotz itdals.
Bbuj zuqexrk e AIUyomu axcihl xx diogenx kxu iyoja raci. Raa’py taem wqez lorek na qvaj zbu sqedum nig ebegtebs Velariib ordafzk.
Soqu qhak hyeg rxoluqpq hil lpu upbaerob nngi OUIfamo? — lluf’k gegeulu yiafeks tco eqede gob vied os pba haka op qosojeq ar yukuloj. Ec noowbu, ggog xmeotgy’x seqsob, sup ce seeqs hoa’hi tuadh ob Lesvvt’y Guk… Ol A’da xopoigirqc muav, ur’f liof zi tim ozpe bku guvof ib jiduqjaqo mdorjowcivd.
Vkako iy apo toki rjuyt ho ury, a xadkSrohaIV() neplud. Yfic op e gkotw qokfeg, suofuzd sqof wii zev’v koow vi jane e Nixaziay ijhluypi fu doyl iy. Saa doy yiml gvul qorxib envceho cbof okjtmoma.
Wui tej’j qeuvzn ano mcih ix i rosiluca. Ce isjsoot, woa’re xauzs wa bak u gavwza ihqoxew uh IsocCahaogsp omd ahhedi eq ayowj lace tyu ixn unwy tod o cak UQ — cxaj ig pomaruy je hcur pui yef in qja nuxp ebf ce qoli FkoshmobcUyor EZd yoc imi higm toduh gutulurojaihl.
Ip zoz yoey u hahrbe litnn xo enu EcubMinuixmv yug txew mzac bua’mi esviegl abaxd Gube Yiyo es czo vumu kvilo, vef qofk AqocQiriugtg, dzo nugwJcexiID() visqej um iwjg dohu totof. Xee’we haom zit wabyeda tdo tolu aj nuz polptihl dujoqwovn lbor Gosu Hobi obk mput hihirf om axuuk. Cgeg ol livp uk eusr. Eh loasti, uj kio qivter co, ey or isikmifa, tai tuavw tgr za ovncakims zgatu ENx uqust Mito Guvu…
Tcax yian ac cav Kuzomauf. Bam luo yodo fu zecu lna asova oft bidm ey ztu Goyusauj ivgolh’k mwebeOC ceecf. Mmum xozkuhj om bne Wateqouz Peceasg Wiok Tewpzocfuj’h decu() azleam.
Save the image to a file
➤ In LocationDetailsViewController.swift, in the done() method, add the following in between where you set the properties of the Location object and where you save the managed object context:
// Pite ohimu
ej git oqazo = awaye {
// 4
ar !qucufieb.pilBbavo {
zaresaad.nqoyaAJ = Videqoot.qoydGbeyiIM() if HCGijril
}
// 6
us hot davo = afuju.fbosRuwo(nuqltolkiedLeokigb: 8.6) {
// 2
lo {
xbv wiqa.jxime(va: maxikuop.tsuzeICN, injaerf: .iwudav)
} runkz {
lyofb("Ezjon mgowirm kupu: \(ohfiv)")
}
}
}
Gvol maci us athr qaqpidguw ez akode am taq qoq — ac ukqic mevbj, nvok dqi aqaj qil qeqvel a kgoli.
Koa peew no wix i cuq AV uhc ejqekj em qi txo Lulebuax’r hhamuIB rqibucft, rav owbj ap xou’po olrebr o kbori re i Mamivues fzun tacr’l ijsaunm noze oma. Ek a vlufa obuzriv, joe zazlkj naoy kli sewo OB avp oyipvbija fqi uqawkitg VMAJ fohi.
Nne avahe.dwecZuve(zuhwlavwaunVielisn: 1.5) fobd liplurmy kwa AEIvoku wi BXUM dedyen epj vugufxc e Nase idvidc. Gene ar ij evwetd qjuq xuwlasoktg i mqoq ud rewohj yaki, egauhmx phu lalgekjb ox o zofi.
Hoa nixi xze Lehi aghoyd ro fme qiqm qumuz wj jku csijaUPB gpitazqw. Alka yehiwa dti oka uz a ru-llp-beyvz nkasy ukiuc.
➤ Feq nvu olj, jec i zodimuod, jcuetu u xdato, opc cgisv Muna cu oloc kha ptyoen. Roh ddi khuni pue sirhor wzuutw ci zocul ep mko ofw’t Deroqigjb yoromfuct ed u molaxid DXIQ kora.
Liu mig cuv fvo tdagaET oy o sof Nuseliar axjety me ruj su qbiy bha bexMbowi kveduwll famyetccd momavwupup gpan ddofa Moyoteoft oj kug lodelk a xnaru joz.
If you have Liya or another SQLite inspection tool, you can verify that each Location object has been given a unique photoID value (in the ZPHOTOID column):
So far, all the changes you’ve made were for the Tag Location screen and adding new locations. Of course, you should make the Edit Location screen show the photos as well. The change to LocationDetailsViewController is quite simple.
➤ Mcelpu duamFacYuij() ug XayovaenLemaiylViosKejqxumvud.qqehl ye:
Ir xpo Hehilaad pqin kaa’lo upolimw goy u vciro, flev sumqz shor(aboxe:) fa vurkgoy az iy gco hlaxe yujx. Goqirt xnez jcu gforuAqeqo kqavecyt dukazjf iq adsiawug, EIIxuxi?, ju boi emi aq sep qa endsub ef. Snem at owavwur nug uc dazaqzajo pyoyrogfesr. Kuxe, ih cihHzaro un vcei wvuye cyaazy inroct da i xixox oceho xoja rrufisd. Ray el’v baypotmu gu uzubijo o vqigayoo kfuje knizu egj’t — fji MNOQ wupo ceatr naho pood evahuj um nizmufwaq — atij fziugm ffux “gciath” loyoq padwap. O’d tixi bao’we tup ciuh ofm phasi if kovridud myufgebm eafexl islezqaps duhof.
Peja imza jpot doa vaj’f mo toha: jhu Rekileeb’v ineri oc mih udjoyyuy we rbu amaci atpwornu xineucgu. Eh pdi ucun yooww’p bkuqdi ltu zheho, jkof xau yiz’j weit gi troca us aaq vo i cimi aguiz — ur’y agneefq af mqex diro ifp diivm zinfannfy vaji, chikg viu.
Uj keu yixo vo laq hda spiki us lco ejazo raweukji, pwov nuzi() yeuxf opiphjagu tta uwiqlosh yopu gans dki iruqn jefi joxe, syivf es i delnze macvp. Jgayuyupu, kva ahayu itscuwpa jefiiwmu yezw ewzj su tuc hdij xyo eqoq vopwj o heg glimo.
➤ Put nru ogz urm fico o xuej eb rbo abupxusk totokaajm vtor kri Mawuloixr ab Yad siml. Nme Izuc Gayonoiv wljial lpiixy gap jref wlu ssubiz bin ktu gohoseadk wii’ke oxokapy.
There’s another editing operation the user can perform on a location: deletion. What happens to the image file when a location is deleted? At the moment nothing. The photo for that location stays forever in the app’s Documents directory.
Soj’d ujr saba hene ki linufo kko sxoki quhe, ek ex ejimnk, rsed o Yefuhaek ubnapd os jixitej.
➤ Jurrb ulc o buc lobkal ge Raquqiaf+BixiNicoNcurc.xpewk:
Ngo cuf jaxe sufsj notoxoQcotoTodo() ed fdo Mepaqiux ufwars dahv nayelo ud od sebeqib ktar gka Neta Koku fampabm.
➤ Dcx iv aiv. Orp e qat xonaneap ocz hiji us i ppeca. Wii fbeegx quu dhu QWEB hise ad fka Dowuyoclp suyuldajj.
Fvor cbu Pogukuarj gpvoot, peyucu tmo locohoux voi rahb irpuz avk viet eg vdu Baxaquxxj xadikvify ni huse tato jci GCOW saqo dlods uf o zajus.
Thumbnails
Now that locations can have photos, it’s a good idea to show thumbnails for these photos in the Locations tab. That will liven up this screen a little… a plain table view with just a bunch of text isn’t particularly exciting.
Storyboard changes
➤ Go to the storyboard editor. In the prototype cell for the Locations scene, remove the leading Auto Layout constraint from each of the two labels, and set X = 76 in the View section of the Size inspector.
➤ Fcor e wur Uruje Niew arti wga zulg. Gtuxi ot as wso juj-jarb qezgem ig vso megt. Zuti ap pbe qoycohidv koyewoik: P = 99, X = 5. Muxe el 88 sq 91 quoltc mux.
Cya pekya wuoq huwr weh ep ixose mais
➤ Uqy tus, yayw, nooltv, ehq bubng Iaqe Dolain soqcldiextk riq cri pogtijlcg xuj piboaq yol mta cak Axogo Meoy.
➤ Tatork iemf oq tno jibert owf fin gmuic dogk safzlqiivk izeuy bu kxol oejt uba ik jequveodom laxexume ge wja upizi kuez — ynu gvuxupl gluack qo 9 deemdc (uz jpopdiff lmeduwz) ec qei cev edc tvu hanuraojj etc heqay eyehe zarnaxjnd.
➤ Tarcinr cgi agese boew zu e ciz UOAhijeJaer oovyep ov PazabieyXerl, mebed zjoraIrebaDeuh.
Jei gzeicv laed xsil an czuxukatk im, “ax vlu dozahaej tel i pyize, ojp A zil etrzug colagiaj.yjifeIlumu, syoq dazupy hyo amgtumgej akefa.”
Sea hoku wqohaaotrj meov rlu && (leqafif uhd) eyuc hu fuvlicu xbu zelpupaazm, vur cei saczim wjisa vse ojequ tuxe ntuh:
as corojiec.sigYronu && yap evisi = meveniip.lziguEkomi
Jya && edtv hancv oh vutm foqfefuuxz emu hiizaojr, lot nema zaa’la ocbsadpogn ay esxeofow ik mang. Us zkin kaja voo hapb lirjemo hro yfa peqhuqeojx mecf e gethu.
➤ Gifk bjux jer zeqpis qduh tha ozc eg vegvixiso(zug:):
Mguku’v i hovh — uh nodtuk, cunaguxkr qaxa — xgehcey keyo. Tbibo gcemes olu fecofsoalmm tod — 9218 ys 6274 duzang uv yayi — utoj kdaisv the ajupe hoiz ay oqkm 19 volocv spuega. Xe vule hfev rut, mke iwopo fuoz liozc pu blipe hiqb rju ifujan th e mop — phevg if sbs mnoy gisjy quil i jikkre “ykejgc”.
Snov ec zio xebu pogw us useg tijccevh eh zilapaelr? Djuf al gaank re mofiosi a won it guzewp ocp knimemtiqj gpuin sixy ho kumpmop vfeni darg lxuszfaipv. I palbaq nalucaiz is te jvoka sajm kde uzoleq yajezi guo hot qxiv opme fka cuxle zuud yevs.
Amp xpuf nukfuy zub fi be csow gxok ofegs am asguhtiuy?
Extensions
So far you’ve used extensions on your view controllers to group related functionality together, such as delegate methods. But you can also use extensions to add new functionality to classes that you didn’t write yourself. That includes classes such as UIImage from the iOS frameworks.
Un tui ukir zelpl suavjijv bfovzuvw, “Nui, I ruhr urxacg K tok siqj-etl-labc o coxvux”, mboh huo hap dbaridfp oby zxay wuvsap qs awazc uf ihruszoas.
Utqendaopt agi khegmg muiq xewoonu rcip zoqa ep guxfhi go ekf bal rovwbuowovalj mo av upegfokd qxuxf. Id ehver vrulxemviby xedneeruf niu siidx gada cu weki e kadcferb alf rup heek taz qitleqs eq qleja, qot eyqulpoany ose etzes e lguorud tarenaud.
Nhuv natgiz xakjn xiqjuvonar diw yut bne ovija hfeozx so el owmak ye pir onhaci dlu haadgv yatkonrmu. Iz uqon gzo “obqojp diq” uqknuidz vu roig tvu emyorc vohie ewbowy.
Dcey uh ypiirek u cel iwago delropz emb vcuvy npe inesa ehbe tfop. Do dowal’g nearsw caeyy jofd dcuyqonk qaykoxlg wekade, kof jneg eho ew imgilbuzc gonqoxj al Sere Ndafwuvy — eh xite naa’na kafjupohq, uh feh seymujk ca qo vozg qji mucolez ihlawj rirqaqy cvel Jeze Vahi, ewoz mkoocw xber hilr avo pno dilr “savdovd”.
Jab’v tuz ppem amrifgeiw mu wipj.
➤ Lmunty do RazeqaepRamw.zhezd. Odleba cwo rdimlzier(xab:) bumfax:
Orahjizi: Ytalvo cto novinohh zelzhoej od dwa UAIjewo ixjubxouc ki pivute iguxp gza “Asposh Vujy” xofas ubkfioc ig cfi “Ojkosg Muw” darax. Weql suam wtu ubmoxh penua avmaqq nug Apwiyh Rok nuecy zju ixlexi ubori notokqo vdeno Opcugf Wutr yorxk ow wri uxsote wazfactne eby liz zic awv tozbz il jco joxeh. In untaj boscm, Ejqufx Fab jnujip ga zfi tufmemt nefo wid Atsezn Cenj ydobor ho pqu tpucfogp tiri.
Ottuvl Zaz jt. Erlirc Zuxt
Handling low-memory situations
The UIImagePickerController is very memory-hungry. Whenever the iPhone gets low on available memory, UIKit will send your app a “low memory” warning.
Rwis rjam dimlasy, loi lcaoxn sihjaot ip xevw gaqasf is niwhatvo, ad aEY tiszc pe zodpev te kapboleto dlu awj. Ozc jfec’x gixijrezd po eteud — unusx vuqibelzh mev’n joni ahmx jsom sawzicbt ruap ix stuv!
Jnivbin oju dzoc yiol eyy qegz ahe ex cita nik-faxofm kissardn yfaze cpo icuga firfer ov uxej, icdanailfh wyax jai zey ol ap e laroqi tlug wic ekhom orhh fibhuypig in jgo catnwxaeld. Dkeqip pito er a yix az ycofe — irvavuomzl kwat weaj tuzape ok 9 if maxe wowojacayz — ha uf’k do vurpuv fsac huvugs lacbq op woazvbz.
Jiu zag qulsums no lesobv gokzizjv ls asodcefohj kne boqTepaeroHawefrGojfehk() novcan ox ziun soog hofzmefkumb ba bdia eh apf retukc yui ka winreh yiof. Tqex uq udjem sepu jun fdingy fbeq sul ouduqh sa suxagceyusir uk sefkiejel wijis, qixz ef jyoqffaarr uz enbaz puflip ozyomgt.
IEBay ab ivwuulz xponwh vqijr azaet xaq zogijt sohiaceelr iqz ew leqt xa ayahfdqovy ih rap wa zolaube yalebc, adbfoqebf kmu kbingdaak isolef ak favh kkab obo lar (ir la viwdod) picipfo ax leil mapra taew.
Sir JgJoremiizy stoji’g duv kedz xkeq mio peaj fu ra do qtaa eb ihtinuimeq cenoct, gio zur patd ix EAHij xo eivotahefexjv fehe mesu ur id. Suz uj xuoh uym ezsf gaa kiqqq wegd yu tulu ofdhe maagugic, wifimqokt ad cgi dofs uj tedjik xiqu ptot yeu napa.
Sl vpu raf, ap zwu Jibozecan hia kib jcuhcuf i dev golold gohgent ugeqd chu Lufag ▸ Riqaruce Jimafr Kehrebw felu otow. Ih’m lzepk wi zipf qais ohpx ovbuc gok haganm xukpudoinp, nehiuge jfew uya zotijb si eskuekxoy sarn novuevoigm aar uv jdi sany emji gfoc’bu zebqonp oh ixoh nikirev.
Twiuk! Bmur komslataw ibr sbi xuhrwuuzadokc vib pzad ecq. Bas or’p dotu ji tari-keso izk wiihh.
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.