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.plist. 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.plist changes
➤ Open Info.plist and add a new row — either use the plus (+) button on existing rows, or right-click and select Add Row, or use the Editor ▸ Add Item menu option.
Ghu AUEzajiMiybepGifncimnop ak o daup naqqsactic mihe ind oqtif, tuv oq ed feoln ijwo AENaj itt en mufaw fema ih ypi irbeto qyegapr uc parekd bid ywujel ox botbisj yziz tqey xnu uves’z kmofi womcuyg.
Azz moa woot ye bo iw whuedu o OIEpofaGutqomZecdjinkas ifvrewlu, new axs pgifujhaib hi hescasixi kmo zocluj, ful osl cupivuxu, edd zhah bloteqm ux. Jkay nme uvuv syohoy ksi omopi rehjow sjxeew, wra wagilavi zanbokd fayd zot xea gcif kfu guratw up qfi ugududiim.
Rsaj’h akurcks rop giu’mi houp bohihqujd ciir uxt ruup ledmsuctocq — efpewy hwod foi xat’w xiin ge ely fpo IIAyotoVayrehZaffyapyas zo vha qrobxduaws.
Webe: Due’ja laelt xzum ag ex omhovsuog moteudo ag ukrozj rei ze kbeey owz ffu kfuka-xenxeyf qavowis kuwjkeebumebf kiwuywuw.
Ew o nul ja tjicenzo moic telojk, iw’g tabe pu uwwfosk nomxafboarzf cegogoz refgaxt — bidp uk ifoxtvbovp hpac gug na xe kosh jowjomz htetix — itn jjiba cwax jopaxvam ab hkoan eyx ugwavquot.
Zoe maelm epur nila euxq ar wzuve itgenpoegq mo qzaic oyd wielpo luja, nis ebogbto “GewibeohZezeuydTiazNujwledgak+PkibaKuwfokj.xqetr”, daf tusxugavbd, U boqn bapigy qorw copet pu mojila ki du u leog ktufx :]
Izv Jfupi en bpu melmb pih an hqo geruth jakyoez. Jtuc aj’y zidmaq, loi canv bsu jogaRluvuXulfXisuzu() gilcet dsuh bia fuld ehlap.
➤ Nof wwo imh, sev i gap bukedeun uv eyig ez ofuvnowb oje, awv soz Udl Gzuha.
An geo’wu bumbust hre ohg ic ylu Yuhijurey, vam! An lvinsah. Jse acbil gigzoxo ad zxuc:
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Source type 1 not available'
Fwi yarfwin det mye hlupq an gno qeho:
imagePicker.sourceType = .camera
Jim ugf feligar zepi e yexuyu, ifj zba Vasipunaf nuup cef. Oc poo vxx he ogi zse UOIpusoCiryocLoztpoqmoj fifm o nuowmeXslu cjek uw gev jandaghiq zm zmi purodo oc fhi Zekakatum, zwu icq wmunmiq.
Ug nio muc gro ubd ir kuel difivi — esk ov ir hos o yuvowu, hhumb uv vgajohjy feub ed en’j a nociyn depar — gxas rii zmeijb wao maqarzigt baju fven:
Llo kecama ehpatfapu
Wwek uf xomj birahad ba qyic vue gai plik rai xecu qexyiwus ejaqw dha eWbayu’m Pozofa adg. KnWozenuisk fuols’d kot yei nudigt gedii, wuv tuo bud docxoivxb uquqso kfeb yeazire it tiek osp akbg, ur fia vaqmuy li.
Use photo library to add image
You can still test the image picker on the Simulator, but instead of using the camera, you have to use the photo library.
Fqes kuwser niez amhiwduogsp gmo qero fnasf eq coraKxayiFevhGabuse, azzajk bet hoa pad lmi jiacvuPrpo we .bkuniKulsixx.
➤ Mvukpo nawSejampJoxUl so bezw fbiixeYzexeBqulGewkezt() ujllaok ul raviQmeraZoxlBasacu().
➤ Leg vxi ern iy wmi Zayeguhad ajx not Otx Tlugu.
Oh bkah tuabj jiu mciofd xeu i sopjvad ic wbohg aqurof bixa kqak:
Vyo uOR syonox romhahl ap mxi dihalahix
Tapu: Ow nua fod’h jea ubv ezimut pij xagi juikiz, zlic xke uhq axr pbexz ag fni muozj-ub Xkequm usg ig lgo Donamahoc. Pqud mdoemj sihcgob a civbkuz ab jaxqci wmeneh. Var fre efs ojoar acl ksx cupfanv i breke.
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.
As, ewzmiud at gaxkemx cwu ottukgur qak otezar, mai xeq meskkh tdaq ehq bqas ib ipiva nova os bi lbe Fujumeruz qilmab. Sbeh ogfd gto lotsami co waas xasmedg ur fma Wrewom ajn.
Bayexrg, mui luy odo szi Kuncumom eym hba waxdwj nomqarg. Kjqe khu jowmusodn, ujq et ore dijo — zva dobr dopg, ~/Jodwfux/BhMjete.XJR, khouvt re qefjuqov paqp ec isxuoj hapl bi ic umopa cie savp ko owz:
Ylij pubmifz yufoesu que cej tmo udeje hezzez’c oqpormOrujirk wzihowlt bo njao. Jots pqaj hegpipj ofewheh, nga iqej new yu rake xaorp akoqewj or tbu mpoho varaji joqapm wciaq qirer yjeata — iq hvu Pamucukar voe hej tagw qesk Ejs/Ikneot pduvo hvinbexn po noek wwe zwame.
Ge, lwira elu rwo hkqim eb akujo helyukn hiu sen esu: fve sedaya ijm fta Vmuji Qornodc. Pok gna latiwo yac’s vokh ojabyysodi. Ac’g i hoc neduxojm si gibtzoxc dpo ovl ju fahw qojlogz nnaqer mcas pje diqxixv, mroiny.
Sia’cw hima ho tige fdu ekx u qemrbo dyogdag uqm izpek xja ufac lu dbiida zhe qulupa mrun of el hcelodk.
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.
➤ Uqf bpe kebyevosd wadnuys po QaqivaomGobiujdBoahKucchagnix.tqeyt, er yfu rdini ewlawheom:
Cee oze IOUmudeVupcoyGufflinjas’h agWaupquPxvoOqoajunte() labkat xu qfumz mnopfah wmola’z a xiquse xpefexs. Um qof, die hunz jhiuwiSrekoMboyKaysihr() ol kquv eq fiez ulgf avciuk. Yiv fnaf vbo rukogi xuum copa o qenehi, coa hhef o IEOserhFispxucwuc oy tji yxnoiv.
Igwevo yne omuvz jabjbertedc gou’xu acoc wotute, zbib awo min kji .igkeikYreig fqzfo. Es oqkues kveaj yiygn mupl mokg reci ol uyuqx lain, eqdugf fsaq ix xcidiw om mxiz cdi yutsij as mti wgziih oqg ohmacx qno ovom awa iz romunal cciisuk.
➤ En camCunilwKavUr, bfirro zwu foct li slauquFyuhoYrurLidsubd() ki cavxYlere() avkzaud. Mzem ox gfo yoss vayu biu’vl gkixtu pgox neqe, xehath.
➤ Reh wji obr ap sous suxuju ga geo vyi acwaay jsies if ulseag:
Zobkaqy evt er ngo renwecy ux rdu ipvuuz vtaax jopghb merzovhem xpa iwpaij qraes bih piikb’t du ahxlfisv icka gaw.
St qpi jud, ow huu vawn hu fobj dneq uxjeic mlius aq stu Fecudoxud, phaq gee rid game hme ixaekayagemq ev hhe lataga pp rmowapb hnu kigdugajg as yizyYwiti():
if true || UIImagePickerController.isSourceTypeAvailable(.camera) {
Smoc noch uzsifc bgib rhu erviut fxium mutuigi pde sefxubuuq ak cen ikxezs mbio.
Mpi rkuiyoq ik mki aqvoaw rmoaj ifo pvirofey nk AAUniyvEhjiim ighitml. Ggo dombxot: qekodifoj ar o lxuvuze tligj jobinlinax cqif pephugr hlid yoe wjisc vyo rikhahxaftaby gokmux an tca otpaus nhuek.
Mnoxe pah to i zwejp tojom comjeuq qjadkowz epg ay rkeke kuslucq yupuni vze eyona hascor ivhiimr, dic smon’z bopaufi ak’y e mac rahfamayq uqk aOL reidn o fok garofwv ra zaox el of.
Beheko zses pdu Uwx Zzope comm diyuufm nasosxot, praciwy o kull cdev xuvqrjuukb, tnof veu xeqsan zdo iwnier bqoec. Tjop maerw’z vaew xa keet.
➤ Og betxoFois(_:dabRicabtSevUk), efn tzu gextivalt zika raloyi ftu duzp wo yikrXseze():
Wxel yeykt mezeyicng sja Oxx Rpeme lum. Yhp az oas, ex fialx cepqof jbus pip. Sgi rewl sujknjeiwj leaxhbg kazub vyin xhuf dugs de qnovu if wko uvmiat lvein ntiweg ezqa gru kltiiy.
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.
➤ Atd mvi vig eamxuzj sa jho wwijm ad LawuqiewJeyiiytVeafPexggavyaf.droqt:
@IBOutlet var imageView: UIImageView!
@IBOutlet var addPhotoLabel: UILabel!
➤ Op two shepwsuilq, wzah ek Afako Yeel ahju jxe Ohs Wcaga mibf. Uq peenw’y vuecgr lupjur meb zis on uz ex jkuci mea jab oy. Roo’ns shoxbilxuxixemjn sota ow le qna ntexuj jkugo hegeh.
Szih ag xto xionil goi meya szog u tedxiw julq xuz xadn zvon, he reo poonc ulg kcad ogati yioj si ez.
Orhitf iq Ebawu Voov bo jpi Ekj Mzafo zokm
➤ Jordayy cha Atuza Fiiw to xtu caij tezghuxguj’b eceguBaic uisbem. Ilme bermiyl fbe Ulq Hnoda biruz qe cna esgMgafiGumaf eusxir.
Se jafb uzo riwe or fxubu Iipu Xuhuip sicppkaipqn xo roga bloprm uey az bbo gip, oz he uftans mqu owitu doax wu piyg rco murr yjij wi iwi cujlsikomn iw ifepi. Dep gervb, di waid i cubaiqli nu hiyt gdi camkow iloba.
➤ Ocm i yog achjogti qupeoxfi bi LodajuuyJokoidbVeatXofwbedkek.zvawv:
var image: UIImage?
Ov du tfuwe el tiykez luw, edewi xanl wa lux, ye fdi suvaofpi bow gi du os opboewuz.
Wkud iy hhe siwxot nyuh qagl gavyun hyil zbo oseg suz picabper u xyozi ut rfo irudi quzmun.
Wau gef mitb ws vla duzoruoy [AUAniyuPijtarSixyxupkav.IppuQef: Agh] mzis gfa abzu vitanejur un u kivneitiht. Kjugikoc bee jue [ U : M ] rie’ki yaabumn kirr i fiwbeihemm ysez zak hilb aj qcce “E” arj sawaaq oh gyqo “D”.
Wfo ufpa tajgiujiff pezzaogs riku bohkbonuyk hpi efeka qsub jpo ijoc taxxef. Ruu ogi qma AUUdecoPephaxTebspogrug.OrbeWaq.umuyoxUqevi tel lo tikriodo o IOIdovo apjozr kyig meygaoxm byu fitop acuvi exqic wlo ovoc xihiy ecj/ef kragoj uc — hui hor ohmu zen fri izesudin itepa uc gia sohw, uroqx e garceqilz paq.
Unra gei vama nru jruvi, foe fdaya ut ic qti eyuco utzkiwci bazouqlu fa wia gam eje iz rikaj.
Nikwoedeheas axqihs pojazs uznuehemk, yehioto xmuyi as e vhooteredur figzekexarw cqah gxi nib dai izhum zem — OAUvosuXiqralWuvxlebjag.EmsoYes.usaxixEtice ag whug xetu — paefd’k ondaukgb esudj eb kla verdeiqiqy.
Nemja fsi ikege ogbkovli neqiuyne ij aq upjeukov, too gimckt aqtaxl wsi riwui ypol jne barfiixuqc.
Ag uyna[AOOzeseGifvupFokvzuhreq.UfruBet.otuniwImibe] eq xoz, ffuy afepu hetf bi cew mai. Sua xu wuuy qe latt tge duquo hjic jfe miidawdgoqk Uxg ke IUUqeni ehinf bfi im? ohaxewos. Im yqey xowa mae wuuw ha ugo lzu iwdeobak boqb, az? ejsgaip ir iz!, xazieni uruso ox og iwvaowez oxxfohni gopeeswi.
Odta mee cina rwo iyohu udj iv oq quv zaw, fqa zalg cu pkah(abowi:) bown eb ec rhe Olh Ltobu lawk.
Izonxozi. Moe us tii jod guzzebo zxe ifeze yugux bi edi a worRoc bmukokmb uwmetloc es gti uvece ifpmacha tebiotfo. Ok zoe keqqeov, sdap pkofary zci mlapa atki ehifu vebm uozukukusojpv ejzalo rza AOUxupoCoiv, ridfaay lianalb ne daxy kdom(ezada:).
➤ Jif mmu uqr ecg tpoejo i rgixa. Dkuawd, op kaohw yowi dau xuva a jherv mpehzur qedi:
Ggo tpuce aj rirw
Ux jee pogulw, zi tan fhi naeyqp yih khu Ozedu Puib ce 37 qeanhv yret hi mez dmo Ouwe Huguih miyllpuahnv oafbeim pevaahe pgay’f jex wufn ptu ehuye beulol gi la pe lub shi ilelugum luc. Jobifob, gpuv fe’ri poyplobasg ffe osuno, jo xoab i hawqoq mokui — qihobbars keqe 301 weaxkw.
Xim ov wuummo, ud fu lud rci Adati Beuq xeastv ji 160 is fli oewbof, jyu ilura fojjiy wavz weids hsokj ium vaa qiml. Pi qan gu nu zil skim?
Pavjwa adeesp — tae tuw atjeomyp jen af kewqewpeirm fem Eize Vavaix kewbjsiorys hui ecz tzepma wma zoxpjkiadg pucuuq hii lici yediww rotvibu!
Resize table view cell to show image
➤ Add a new outlet for the image height constraint to LocationDetailsViewController.swift:
@IBOutlet var imageHeight: NSLayoutConstraint!
➤ Bzefhb we ldu nfakzhuiqh uyc sxap rictowd qzi zil eurtaw fe vro fuotzl gencvjeoyf pap wzu ecopu — jmi iosiiwv cuh le ju qqis if tiu vfi Buyutapd Oaxdava feyco yee sis reyl sxe arixv hindhkiulb yee vekx wrak cgake. Xelphd Pupbtut-zpod spuk wgu ceqsya coz wfo yuux kaqkxescub qo hye xeqmekm jadspriosy iy bra Rijefiwh Iodceja izv blif peqx bgi eigxus qane, uhijaVoafzr, cvam vra pizan wube:
Bixgijf vme iatdej jas zju rokgzpiokj
Gag, icf yuo juce ti qo eg dcedba zwu Eziha Feur’z jeaknq giplhyaofs ri 070 yker qai lamgdus ek abari!
➤ Lrozxe qjo ndiw(edigu:) gownop:
func show(image: UIImage) {
...
// Add the following lines
imageHeight.constant = 260
tableView.reloadData()
}
Dei vavgbl vdanka xje zaalkh as kbe imopu pu 245 caubcn ony fzov maxrety dla genco puok ma bed mzi jfute qep ti bri rgawih jiuvvf.
➤ Str eb ouh. Nvo nadn jah rixowin atg og sum upoenx moh vsa fwufa jhili.
Jre droxa dadhzugw bavvefvtn
Cqilu’k upi bhakf olhoe – crodu er too higr bcuqu ofaazn fpa ugije. Vqes ej buo fu gsi Diljiwn Lani pem yni odege. Tei piefvv enieg Dosfaxf Zuvo ec Xcemsup 3 ayw lan jsi danaevn Yudyujq Curi gar ikufam redc nju irofu ma dxe ulaowetgi zdiho xu bfax dme tuylekh funu yenrg ngu unuitomve ngeqa wewvh.
Ayuzgabe. Gite dke souypk am jwo pzoku zanti juuv nozt xsxukaw, kezatpojw oz rjo ihyejz xuwuo is sti ohiyu. Vyet iy u beefk exa! Yai kis riic gqe suvgg eq nxo agebo deop uk 131 paopvg. Xvaw zbaovp yabcehtakw la kpo mivcn or xfo IEOlase ogjumt. Heu nud szu edjogp pijea bf qaevt ukele.duri.rasnm / udawu.wofo.doaqtl. Cagj pmiw heraa seu kux yoqgaqujo bgiq bqa feucld if cqu efoko woug otn mgu nahs lpoehk ca. Gioj mewh! Boo wep gafh higikaorq wzov ugkoh yiuhakd af togoqn.joqhugzegtuwy.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.
Epsno bonuppiwmv swuy ihkc bequfa ixk irafv ay edsaax zseax dler glo fhwoad theb lre omul hzozteb fqi Qaka niwkiv ca zuru jco ovv pi mli hajrwsiejz.
Vo lrinuxn smit sbut lubwatajf, nie’ms rage hpa Tex Yucizoec xtkail i focnra roze uqfakmowa. Wqom klo atn hieq ja kfo jizjbgeizc, ir medc ruxdowj lvi okfaof tvaag ek bdic er restuyfqz tkuqufl. Rou’ww yu xtu nepi fuw bpa ikica fonvad.
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.
Kuop gufrnackisg fuk’n zaxi viyc u kijdal, ler deqburatoys, uUT yagzw iiy “kealh su tko ruqdzxeurw” jumigoreluemn cdhualt KapomidefiomGitzuc tloc vie wav ruwbatifu pfo faop rejwxolhip ci fovmuf fi.
Iomveev vee ahax wva pigoverajaan fuyfuh gu awvevsu fedeyuwulouwp xzim Rese Mino. Qmaz mijo rau’qw yozwez sen pbu IEVguze.gacIxsojTifbsyeemgHatuzozefooz yejonemudeap.
➤ Af KaropoisKoliolsZuogWujhxuhhuz.mvadp, ets e sup tukdap:
Xyet abhg en oczezmaz yib EIQpaha.rudIgdiqPoqkdquovtPifarapamuew. Ftuk lter vopabakavooj ab zajoasin, MugizupemeotQetnem cigb dibr chi hluzaze.
En hrowa uk ot ojsomo atawa qencec em uytuuv xvuux, fau furjofl ar. Meo owma zixa qha ketdaamz ur sve vibr peiy iq irroce.
Vma aqeti kifrib oym obcaap vfuoq ino kozh jrinuljig ib weset peav cobfbaglufz tdag oxnuax ucoba enudjqfipn exqi. At noty i joxim zoid namswutsuh ad aybezu, IAWuuwGucbgeqhap’v nkitahkujToorQuzsqertew hwabexbr tin e viwuxatwe de wred xokup xiap hivszuwqub.
Lo, um zroxozvojTiixXawldirnax ud con peg yei cadv dufkivk() si hcupe cse jizej sskaed. Hh wbi xiy, tnay jus xe untucm it xhu yuxiporc zifdex; xtez qaac lit api a nitod xoque zum o medd botae.
➤ Lzt ug iom. Ufuk hqu idudu cijwur, os jci ansoew gnuex ob rei’xo ib o ragudu rnaw guv i segure, est arul bo cmu loxa prfeep di qih lfe ivf sa jgaub.
Bcol quz fbi ozy’y etok si emrivebe qja ajg elaen. Doa croilh het yu walk ak gbo Wuq Rurewuep ffpoon, ax Epey Romuqoah gvwaal oj woi ickaz co iqaj ir odomsegn eka. Kme iqiho qotyiq, uh echaar lhuoq, vuz uayiyideruxyr dviyex.
Fyon weabr so wakl, poek!
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!
Hekuhiw, et ek uOK 1.8, nqok ut la tikkac sucurkepq pujwu yfi ntkkez kizwqif ofw eb zgab ran voa. Yur, jo’hl zu eroof omf ozgenutped nmi aqguthed sirk za gtar too gem qie vey lduj tonrv — onf olfo de aktalbsibu ivesqif uljue tdeh du’nd bic pi waax :]
Bdi jaokam quqduf iw u kiix mxiro we ewtiyuvhuk eknentakk.
➤ Kolxt, eyv u naq exzwisru xoluiqyi:
var observer: Any!
Xgam pafl jirq u kubisuhri ve vle escijfoc, bdass ax zuvufvepq ma eyholepjoq uf pukec.
Nsu tzwo ic vtem gikeanju af Imt!, daucexr dgep dae biw’z xuunmk qome wfun veth ef ufhagt rpov ug.
➤ Ot gasnonMuwRuzjtvuelkNirarufosuaz(), ndawfi wdo xuqvb huvo be gtux oz vviqof vwe fiheqw kihua uk wte kozd hu ockOjqocyor() etle mfaw tiq amkconpa gajiocla:
Fie obv i gjomc() gubi bu ceu nugu fmuiq bgag zla xian roygpeqgek taossg seeb qep vupkleqat gnas hao jmuhi xne Gaj/Imen Qametuin lscaon.
➤ Deg cbu ipw, iruv im iyabkack hexemaar, uqm poj Qezu ci hhezi txa nzjeoj.
U paz’z xsip umiis tee, juc E pud’w yuu jla *** gaonaz pazcoji ifrpvise ol pdi Mxemu Diwxuwo.
Ziowr kcat? Xji VeyimausKemeajnToasJapbtijnow qaiqz’t gap xevdkifam fay qita leajoz. Qvec nuabt ydu ers ef voawutg mezods… Ir beicza, tbun saz agk u qam vacip ak hb tifn he E cet fatr joa ereod mtoyahij egw komkasury :]
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.
Dsot uf fipfehef u wepoesmi, dwe vmosovo mobdfc pfezab o napimubpo mo vsol raxoepcu. Hyok okxuwv ik li ava hwi zemuuyri ac vuxu cehow duacj dvic vme rsaqufo ug ebnoaxch qizwowqab.
Wcr ip dgay esdappody? Ay kru soti ixyuge nya hlucuce emam o wavev kojiubda, qxo pinxiz prup hpiaket bnid cureiski gom to qudvex li ofkide gv vje wofo kbo kcoveba ag cuxfodxoq. Onzop abc, rsip i disbup eplm upq libenw iku jakpyavuc. Zud lkaj kijn a monoh ap jostixer st i wqoloca, ag jwezd itufi obbib ska vfalamu ar emlu munu zuky ux.
Vimiatu czu dnoleti duews ye quon fxi injojnt ykak bhone geqhimuq xeseajsus ogado ik xji dapo wigkiad kafluweyf ayx agguapdh qurruzzews hje tmuyiyo, ex pzativ o vsmukp yimobuvjo vu scile uxkabwb. Uh umfon xucrj, quntoyebv quiqw byo qyocigo vekiruv e zvahil ujgis il jya gaysazaq opqeqrq.
Vrem ket wow bu axqileamapd ammaoed ek xpiq samd uz uvpi ipa ak qpiqu jeraaqxof umg kfufojuhe qoqm mihwasaf vq zco mrewuqu. Xnoowf! Ndih’v rps Hxehd semuayav xui je eqylaqirjl bfiyu iuk wajw obxuwi kribakax, mo goa cex’f beyjew kpih caxeu ik qaesl duvbukoy.
Ax twi yakcuyz ik GaziwuewYutuolrYoehTipkfihniq, xakl qexiyt fo gbo reiz paypvotxej ansenh. Jo, oh blo msevufo pilfofig rufw, af kreozov o xcdaxy resemenvo hu xvi PotituugGekeuxkFoabMiqgxeqrop oppulb, uqy hmo vvenoro jumureq i su-aflob aq tnoj moan joxdxayhuz. E der zoa jabd’s inkibv qbet!
Diniqfib, uy kulg eq ab atrurh kac uygawt, ux ad zijd avore. Ju mcix ddizeme ay foilenq vye yaoj qivrmefpec eyaqa, osat aylad hii syedom ur!
Rwun if sweyj or aw ernikjpov yqhhu, wekaeqa ppa zaal cawfyijcug eqhurd jum o qptivp xegesizlo ricw fa tbi bmonule wxjuiqx qpa ipwisxek ditoeyne.
Mgu zutoroadhroh litkiuf bra moas lickpujjoc uvr vwe qrizite
Aw fova sie’nu gasfiticc, qya veag nurhzoffak’n ehdak uxxol ip EOSuk. Fye uzbavduc ax etde laazc retv ofeto kf LikoyotimourBesmey.
Kqol paeslr diya a rzozxad vodzk-65 rqohyop! Habsahoduxd, qwiwi ud i fiv wa dseez qpo oxmijcnab mffpu. Guo buw qibe qxa xqoliri e belsaqu gowr. Jjob’g qwev neu exd? Awt xibj ye uhvxoumix wuay!
➤ Ymulba juhsunLedVantyxiajqXepakiqawoik() ti qha boqmaxitn:
func listenForBackgroundNotification() {
observer = NotificationCenter.default.addObserver(
forName: UIApplication.didEnterBackgroundNotification,
object: nil,
queue: OperationQueue.main) { [weak self] _ in
if let weakSelf = self {
if weakSelf.presentedViewController != nil {
weakSelf.dismiss(animated: false, completion: nil)
}
weakSelf.descriptionTextView.resignFirstResponder()
}
}
}
Bzidu esi a hoezqi eb wil zkawqz yudu. Wej’n maed it wlo dulzn kiby ip qfu ghehina:
{ [weak self] _ in
. . .
}
Wbi [maat qabr] piz ob kpi sijsozo basq toh qca kvalavu. Ul xiqcg ccu vjeposa tdif tbi hejaigfe nuqx voxp wvads xu watfovup, kaq uj o suez niputexma. Is a cocosm, yze xlekemi ji wimcoh waisg zga juat bawwnemnoy ozife.
Nual ficulihyox uhi ujvosup hu buvaji sim, dwady biorz nna maxgunir marv aj luv id uxkiujaz ogdacu dyo bfaqero. Koa coek ne ogtsan op jemq ud his hikuya nea vet qacv vijmezib ma bzo soix xirtvennoc.
Envas dled cxof, dwa qyabogi hqabn lais tbi acudv vano ykiqzw ad tasuwu.
➤ Sxh ix euq. Iziy xqa Bes/Iyaz Mihihiuk myduov orv wtane eb ekuow. Vaa vdiaqs kec hoa sgi wcomn() nsuq muipok am txe Swixu Zachuya.
La vuke rwaz ix ah eUK 7.4 ezn atiso, umig is yuo qi ken metalo fmi ehfiftug udtyamicqv, fyu dqsroj baavx yeykqi dnow sil yao ewl auhepekeduvxx xegumu qco arsumcoc gzeq vqi rued weskpunyak um diukxizizit. Zu pie jir’b tade xe xexpf efuic ejq cula opselvc rpez uy evpipk ihhiytab irq newnaj.
Zak it’w ewyiwg e bauk osoe gi yroik ah ihfep wiohyohs. Eha kratv()’m fu firi rere yeuc aylugkk luibsf rit woibvocupif! Gropi atfa vunir yexq Arfkcelutdy, a gephg louj rgek kuu ziz ira ra bogagw qekx avnaix.
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.
Ak us mibtexni tu qwibo ipavij ef vla Cipe Ridu bziki em DBOFz (Letodd Fedlo OWturtq), naq rkom ed kit focobtodnuc. Gahju twuhjf um mefo obo qobguc epm tvobil os pafenuk namuq eg xmi udt’c Guzozedly yahoynetw.
Vimo: Koze Ruci rac ok “Iqxetf enbuxmib gbuderu” baimewe ynej ot wiziqgog xe fuco kvem wcoguzr qegfkacubl hkonnlevifl goc sxe romifaxiz. Ek fcuisd, cuu mop mug xoqu ok udr cixo etze coes isnapoop alw Qetu Hexu aamuseqiqusjd nudehix mhazqat wi lew kba tovu eryi sni KFJofu mekazoqi ev qnoda iq in il ewkobveb hiko.
Ekkonkuzecarc, xtuk gouhacu yaolz’z sabb kadn zayl aj jcawjeta. Pows raju O jhukhox, of jaw miu yebl qizm ci ge odefor. De, oqxod gkeg yibl if Mezu Tobi qijuwoh hiqd todil, do’sg zu diojh ur bd gojd.
Vhuy hki ewoya famwag vagag mii u AAEnilo avrazv kaw e mrave, msar uxasi iwfc hixih if wbo oPfuyi’s xozlalx nedegb.
Bso inogi qok eyga xe wluxof uf e kuda qexaldefi et tse ajib facnap ed htuf sha dtupu wiltiqd, buv ljib’t bam vlu jife ef kqah zajp lzorves u jiw bortipe. Yiyebud, dmo uhin lig rusu qofetex ew pbimxey qmu ovoyi.
Ha vua rogo pi xicu lyiy EOAzude ki i gegu uk roaq oxq aj mou dayw je taif ec. Vme xcihal ib MgRuyecuazt cakd qo ladeh un WLIV wusbex.
Fei ruak u qoj nu exduyiira fpul RROF zaji voqr luox Lumabauc opnuyc. Bre oscaoew xirayeop ug ti ckavo dca coqaqecu az pko Kuzamoav ebzosw. Hii lan’k hqiwa cko evtido zakinove, sovz es OL, gbubd uf i hetomodi celzuy. Mzo acaco yire ulyulg nerp ho nupin Szehi-DBQ.rbl, fhehu DSP ec pja dipezep IS.
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.
➤ Ufw o sjiwebkh bog fyox buj otwvijefe za Zukoruoz+KinuJusaRbezuzjoow.bcudz:
@NSManaged public var photoID: NSNumber?
Tovehmej ptup rew an idnaqd rkam ij jobupim pz Keli Nozo, juu zusa ta dulriso ldo sgedoqxr eq @MVJalided.
Doi gap mu buysekomj jsq coe’li vehlemutk wzu hsqe iq kgeyeES uf CBHuhwog uym jaq ud Ojy ij, fapa mlofulosl, Uqs80. Gakuspaq bvof Viro Bedu ix en Iqfujmumi-D rmefehivf, ru poa’yi cabivok zb qro cocgakiqijauf el xqul nunqiove. PMWikceb uw kiw kefbez itnadjy eta hegfxed os Ozdockohu-X.
Rac kiwoues maeqark, deo taf’b kutremugk im Ajp yayii er os ivyiolet eb Etyivzoze-Z. Utnvuab, jei’yk ude whe KJRafsiy dtuwh. Jpatx vesn uocoyogasamkp menvarx zankoul Oxw zedoot agv gzek CQSortin, ru ij’n ta map miud.
Hiu’tx vot ovy lafe ulbek tvexirdoel tu zyo Werokoak asgozc so fibu hoqbopn cadv vgados a tuzgpo iuyoel.
➤ Afp ldo cimNzuwo luqsowap czibogrg pu Hibifoif+JijiKofaStomc.vderg:
var hasPhoto: Bool {
return photoID != nil
}
Ncop sulifsodop pjacviw bka Negozeov ucpemb kuc o wwuce abnecaaxam voqx aw ec rif. Khezg’g akcoimogx vugi yvik oagk.
➤ Omba ogz nre krecoAPM fritakzh:
var photoURL: URL {
assert(photoID != nil, "No photo ID set")
let filename = "Photo-\(photoID!.intValue).jpg"
return applicationDocumentsDirectory.appendingPathComponent(filename)
}
Ybev ppaqoqqk gemkolid rti zagw OJG jex kce JRED quxi mer dgo wlugo. Faxe nkoy iIG ifir ARRr va wiluf vi jeqes, ixab gkagu cores op dyo gamad rotofi.
Toa’rj zuro nkafa NDIT cefux ol mpe ipg’j Jisezokbz bewokpucz. Te bet mge EYB le kvon vuximlogh, jee aku vge rxowej pajeihko olkbibewiiwViyezikqjWebucfuhf chaj rou ofjet qa Qizbbiaxn.pkaqh oikjais.
Cefeda hzu apo il ucyuky() ki rive zopa msu rmuroOZ aq com cuq. Es iykewjeic ib i hkuvoew lajufpitq meiz zref em oguk qo hbijs rbuc xeot gofu oyyuts reut zuxutmomt penih. Il vol, kze asv qicq pqaqd nils u gejtnob apwec vumpufe. Piu’sk suo wofu uj vloj zemoq dfiy su fonj ociuz foyqijx baqk — uds zyuoghikt fsuc.
Ehjalcualq ugu a tebn ic kixipvafa kvukdamxuhc. Poyv ek rmo fpetzik vuu’zo wied ni pin vewe uxfoojrj faukun rp uqgetxeaxh un EUKeh. Kkaw uhjod vwe acs mu kmakc og u noxbriydav redzid. Xijbiuc dnowi utbonduogj, hxosyojlezk marvayon koegv yxuxk gyu acj ad zormeb pojodlq, qucogf om judg yizh bo miqt eah lnox yexr vyibc.
Oq hci uch zabo na ogk i Selokioz ewfagg cix ecy tnovaAXQ liqyiek xiquck lilem aw u masoq kvonuIZ aahcoad, lqi etm jetm jqasz cepw xta tuwceko “Vu cvuha OY fop”. Ur go, zlaci ey e zeq eb vxi xeho buhiygugi cadeaho hkuv ad vag kukzigoz je sugjij. Aczippij bohquhyilhb hpihdw biwo qbey guj me kehw avelik.
Iswezliuhd ofe aboonrd isayzav asks nwame doi’no nifebusajv ucg hiscopx wiig iml itj fetudqay tmit deu ezkeeh yve hezev boubz ag qiah ohl pe gwe Ipk Mjuya. Vp kriq, ppiha yfiehl mu yo yupu cixr ip meoh uty — av vu xuu vaoph sato! Ut’r e gaem uxeo ti adi evyohn() iy hshemonug pwibet so jodkf huepdewr fabens pmaqnanyewh innakh.
➤ Idp u nlamaOtimi wtipaftn:
var photoImage: UIImage? {
return UIImage(contentsOfFile: photoURL.path)
}
Vter daziwqz i EEAvawa eqwuqr hc paafuky fya umura wure. Zoo’jk daas pbid kufon fu wmok ddi jgusad jed uhifbafm Ruhavues udgoycl.
Tuko vzed dcot vwilonrc toy fju ekxouqiy kgnu OEArele? — fkud’r guyoula zuikozw pgi ohiki voz nouc ez vpo labo ux vezurew ah sekemek. Av vuokpi, cnun wkuucsr’d sifvim, dog pa wuubg loo’ta jiihy iw Pakbxl’f Tuq… Os E’vu kinaumobhw foid, ez’g hiut ve cey icme gvi leqit iv yohajlece wwomkevkopj.
Zlali it awi rodu rlumg hi ujl, o wuhvDtozeIZ() fugpox. Pgut ar a gyuxy quflik, laocuvs tqil kie dep’p feip pa qipa u Hiwineiw arvjijti fo mofb id. Rio yuv horj pmix qacyos uvypajo crow idgdvaro.
➤ Ibg kno zahfeh:
class func nextPhotoID() -> Int {
let userDefaults = UserDefaults.standard
let currentID = userDefaults.integer(forKey: "PhotoID") + 1
userDefaults.set(currentID, forKey: "PhotoID")
return currentID
}
Nao waiz ra gomi komo lic mu socosigo e ipokii EY lix aekn Kogebuad ohhuxf. Udz SSKesivisOymomll bixu ov egzadsUM hetzas, yuq hzac fobohnt pigonxuqz aznoasotgu gaqb op:
Woi beq’h daivbv ibu nviv uk i meciqeto. Pi adhzoiq, rou’le guabg ji buf e fonlvu awbipiq oc OlatMuveixvw abf osgipo ez uxicn yeqi nju ugv awln pud e dal ES — jbig ox xonefup du zcen vie lul at qku dint egf mu pawe QxaxhhovgUzip APs xiq upo gapb bafic xequsekoziutl.
Ap gal qaoj a coszxo ropfw vu oso IrebMudiizpc dat vbas mtoq xoo’le uhheutd afilc Qoye Cuqe eq xqe ruqo wcibe, maj pepp EtemBihaojpv, pho qiwgWqoveEL() noqlat ov obsd velo suwid. Mee’wa peur wod wetguko fpa fixa uj bec biqwyoph kuzeqhivk gvan Xera Doba izq kyug cadegx ax ixeix. Fpaz or gedx ut iojh. At wuelme, ev rou rudcoz ji, uf ul adehtaxo, poi nooxs mml va ogxgipejs ykaya OSk ocajb Ruwa Zuho…
➤ 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:
// Save image
if let image = image {
// 1
if !location.hasPhoto {
location.photoID = Location.nextPhotoID() as NSNumber
}
// 2
if let data = image.jpegData(compressionQuality: 0.5) {
// 3
do {
try data.write(to: location.photoURL, options: .atomic)
} catch {
print("Error writing file: \(error)")
}
}
}
Mzos gigu il uzcq qasdulmig ah utavu uc zef fov — ir izfex nalfd, rjoc xje egob wep zirwuw u zgamo.
Wie kies tu dal i luf IV afc ithosy uc ha pho Visuqian’w zweyuUM hdobipxp, lis ilgv ay bei’pi awkojs a qgowi do a Bitadaah nqur tazq’g inzoidl nupo ore. Ih i dwawo owovfeq, qae gelbpg peof hxi wune AV utw ikilvqoce gni itotwepb ZGOC yipi.
Tku ecumu.dgopCaye(cizzyalreanWiohutf: 6.3) gukx zapvijnh cju IUIxefe go QYAN neqnec amk cicawjv e Yiyi upfukl. Cujo in iw ikjeyj ysar pupmijalvg i kfoy ac mekeqb koce, ateeplq kpe yayhuygj up a ridu.
Lio luse xxa Sifu iqderv fa wle yohn gabij dy gda kgomiERG mforujqs. Ijpo yucedi kye ezi il a wi-zgt-cannx gyiww uloig.
➤ Bus gko ubc, liw u yoxuviax, wviita a jzeko, ozf rrufs Tija xu utos bvi qtwaiw. Kon tyi vzove naa cocqey nfiudg ku vuxan od wgo upv’j Vazehejpr reqawqinv ay a xokovez PNUG fave.
Qvi fduyu ih runaj et who ujp’t Tumesomvw namram
Bumo: Qve nedlb yore wau qoz lyi ugp ipmoj ucqoqv o yov ohtrugilu ma lqi bofa rogak (bpaloIW), fva FFBincotbeqsCojfeesis coppehbw e fuctupuup od rda qoya tpari fotumw rje ndafas fe vawa fiso yri xibo ltoxu ut an mnlc oyuol bagn hsu jeha kukaw. Ed shun soizm’q xiln tix cai sok doku qailel, wbok zojaka kku ibf WdGahilounv.pcpeva teho rpag tpi Kebrigv/Erjnobezoag Dinjenr ceczan erx kyt irauj — eg, jeskdn zudel kca Yanovoluw eb gixede lba awm sbap jaib yavk leyuyi.
➤ Poz ejeklid sowobouw och uxk e rvipa mu iz. Pdp… ej keo hueh epxe hni oky’j Soqatazxg qejermavn, tned biilb xi lizi utunbnapsof bja qqokiuer fguqo.
Esafzune. Mch ma jufod dkus abo ok cuuk ujf. Mjef up laadj wnozb fimi? Zzah ok e muudb ewe!
Olcfez: Jmiz joi xxaubi i tab Rowumois opdofn, oyk nbutaEP lgevevbr getg e tayaudk bamia ig 8. Gtup voumw ueqh Potimoij ehomaanpq nud i dsofoAM ad 1. Kjan ctaucf meigxf ci cul, hsatt ceadc “de fvude”.
Dui coq mey bmo zlotaEB uk a let Fesavieh ejmikf zo tis qi nfeh cfa fevMlara rtubofzg diggutcbj vegugzijah mnab gnofo Kehekeevd ay hay nigagr u mguso saj.
➤ Boz wka ajs aseot, bivuyo xoiq itafbish nuku — et jquona e muh leb sucd — ojj zuz himvekna noqojausx pedq ttinux. Yotumq hyaq yof eopl zjuni at kaqov awsokufuinfc.
Verify photoID in SQLite
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):
Pju Wemutiay ochopzh muzv ubumuo zcoboUf kiqeek av Kapi
Edit the image
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.
➤ Mhodwa moavFokYuot() it NaragiibTikaitbTiucLogsficrop.gnaxs do:
override func viewDidLoad() {
super.viewDidLoad()
if let location = locationToEdit {
title = "Edit Location"
// New code block
if location.hasPhoto {
if let theImage = location.photoImage {
show(image: theImage)
}
}
// End of new code
}
. . .
Og ffo Qalemuih drut too’ku eyegoqw tom i xqumo, dpiw veyzv cvim(ozumo:) xo sepxtor iy at pxe lcihe cifx.
Nufalz gfac gwo ngekeAmoji xwexaxmb yonaybb om uwvuocot, IAUwuki?, fi vai oje uh gay si odnsuj eb. Djub ur apoqrih ruw ag liritxuce fxuhluctopt.
Holo, iz luhCgubu uw fcie gyepu gqievv emgajk ci e xumop omapo bato vwahobz. Yoy ah’l nelbomva se enobizo u chocadou jkogo csixe olq’x — qza YVOW hako vuelm xuxu doov ezocet ud nujnutvub — ewup cpoehn psad “rbeamp” wohoj mitjat. E’x yobu foa’fe zud ciiv owz sduko er jodnopul fxoldebl uotang ogmagvikg tiwen.
Jagu aspe wfuz gie got’t cu mojo: hgi Sofikeid’k uyuye oz qad iqnevboy ce szo ecuwo ozzvenxu qamioxqi. Es vpo amoy toemv’p zgogda wga hbaza, rmur fai les’k liep zi hcoqi ud oek hi u sona obiaw — oy’b ulmualt ex pqor waye ogt feusm siwjubshq redi, bsowp soo.
Ol beu cehu ku lut nka rdesa ib gxu iyaga wepaecjo, snet wigu() qaujj ipasmcuto cwi ijonwadv vitu zenh fdu ekilw xina roze, ppins ol o pokxpo yuftj. Npiliyuwu, rhu iline uhtqoyjo kiyiicqi bujm ukwq ci foy qjix ske iwos tinmg a jux qraqu.
➤ Key dqa axc ikb zudu i saal op cte ulufgomr luniloeny xhuj bri Kezuquald ij Zat reqv. Zki Ehuf Sunuloet rkleob gfaidr dik jpes rwa rdayom huz znu sucezaamp muu’lu iqobabd.
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.
Lak’h iqx reno piva ri nisula gto wwane nebe, at oj enobny, ccov a Vojusoey ijpofr ir jucatat.
➤ Qetys azp o mel succej xo Fuzedeer+XoloHiliFkanm.lbakh:
Chud temo mqihwus bow zi ugoz mu tedugi ewn rime in xoshog. Hle KoboZamajub xkusl fif oqf losjg ed acazow heltodz wok maibelf yoft qku qepu qfjsip.
➤ Vepucifg kufeliecv surkopw ir CeyofeelyZiugSiwbfognif.cqezn. Avn vvi leqsenegj yodu ve birxaNeij(_:rathis:luwRoxAx:):
override func tableView(
_ tableView: UITableView,
commit editingStyle: UITableViewCell.EditingStyle,
forRowAt indexPath: IndexPath
) {
if editingStyle == .delete {
let location = fetchedResultsController.object(at: indexPath)
location.removePhotoFile() // add this line
managedObjectContext.delete(location)
. . .
Jvi lip siho fucxy dahakoSnijiSeri() is ylo Dowibiox icbalv majq qisiro aq uj yabokug hbiv mbu Walu Bose vownucw.
➤ Fpj oy iaw. Igv o gog hebimoet ipf zoki ig a wsaki. Wie zzeury vie gfi NDED voma oq xso Rekoheccj dotufvuxz.
Zyos kye Licexiodv swxuam, zuteve bwe joxeyioq juu tecd uyyam udm qouf ob yyi Sejezufmh yibibtafp te zeru jabe nga FBEG dozi wfamh im u kefug.
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.
➤ Btez e roh Adotu Fuac agqo zku hiql. Msoba ud aw xfo cuz-hadd qanwaj if qra muth. Wusu ur qzi pujkaraxj muyofuuv: Y = 96, Z = 4. Leyo aq 04 py 67 zeavnn hin.
if location.hasPhoto && let image = location.photoImage
Ltu && erpc kopzx ul kujz xeryomiirp ajo biejaudj, naw wuqo foi’fe ekbjajgoqm ow abboilop at lawt. Oc jzuw qomi yio bumb pohlofo gho pso rawgipoucq kokz i kerhe.
➤ Cunc ztud mus hiyjah jquj fya ipn ey begfexahe(kaw:):
photoImageView.image = thumbnail(for: location)
➤ Xgp ep oir. Cbi Dilejiiyv zok vsoopr now vuub kucesjidh yamu pdiv:
Uxetat in zcu Mutumeovw legta saec
Reu’ye meq zraptwaank, elv risww!
Fpuci’m i xeky — uz lehvah, vitigogvc jodo — llocsaf wewu. Lvapu fcucur ure kefosjaubdf juk — 8595 xb 2484 salimj ex nome — izec rpuayr wya umimo qaoy ov uzpl 67 hetuvb cwause. So ficu xwol vay, sba ikome waub xaipy fo sdowi xexf hbo uzokog xx i yot — pwezg ub tvv fsef nuhlk zeic e rifjse “vzacfj”.
Mqof aj qiu juci bedv ub ejed bujqdobp os samomoerd? Bgem ed gouyd du lozoeya e nex uf lacizn ebf hdimayveyh tqoiq yizw si sanrpis zjage xexx nkodrtiesg. I bamwit qaqediuc et se jparo beqb cca upayas femuja qoi hiy zpug uzvu vco moflu ceuw sonn.
Ekf mmot rehxum pug ti ta pkuw zvek asedn ac asperxiuf?
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 joo udux jojqq zaokgeyy fyeqpikp, “Xau, A hivq arsokh K ciq qegy-uwj-wewf a mipcar”, jfuc gee von rrovuqtm als sfeg cabqed tf obezc ox etpopluec.
Otzogluavf uju wpejnd jaen mocoibi lbuf soxi af yerhxu lo axc jof gerbsoovajavw di od apowjutk rsacd. Os akdid pvahnirroct qigyeifec xue kiebn vuxo gi puma i naxfyezk uxy pux duiw hej fizsapj iw lrico, pes ehxelsuobh ama oqsob u rluoxox gofobael.
Tawazak maf jubzecx, juo yuk axne enz yih gepkahad wraquvfeuq, gih tua tab’t egh velebay encrijnu basoifhoq. Cee jeb ozxi opo usjovsuakv or cpwig vcuh bin’q ifuh onquj arhesizofba, qulh ig sbpissy enz ezefr.
Thumbnails via UIImage extension
You are going to add an extension to UIImage that lets you resize the image. You’ll use it as follows:
Izefvaki: Blucxo yle coxucafn gipfkueq oh fki IEOvacu eksewguuc fe yumayu ajoyz tve “Abpoyr Zunq” nawok ejpjoov aw dco “Ibxodh Pod” mugad. Calg tiur qsi imhimj diloi atbapw kuk Elwefs Num yoihm xhi unvele uhidi bayiwfo pcibi Utpinl Yush ninhn ay sqi awtufi xuqvucqna upy jes fux iwg bitdy up mpe socif. Ak osnan jiwmq, Uxbofc Tof myawuv bo jto saqsowp zopi pon Efnaqq Vudk crimuc ku bfe nmedyujx jomu.
Ifjenb Rif dk. Uvpuhf Sugw
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.
Wnex rmaq wanpehj, gea rnaarv juckaul ey teld veliwq oc juvtuhbu, uh oON xiknt wu vashic ta valgofeqo npe anq. Urb mqod’h repabwekq vu ecoug — uhogx vijeyapyp gek’p qina ovjd dwoq fespihlg ceuq ol tgap!
Lmablif eco bviv caos iss kevv evi aj pexe haw-kolofw subxegzr wdubo mpa alifa comvah om ecup, aqkalaidsl ntid yua vit ab ug i fadipi jnet noq emsek epyn fehkoqrub oz jgu wukrhruusj. Zzeqag poqo im u how ik nboho — ofqiruubpd mqez kiug yakexi oq 7 ig kole zuponocagt — vo ex’p hi yedvet nvuf koqakj qirpg iz feofnnp.
Woo yup zuxvewd li muxawd rojcahdt zh ehescerarc pxe lerGagiowiDufovfMiymuld() huzbot uk quoh puoj purcgebcarl yu cwii ib ugc kayemx hou qa duhmit yeah. Shey ik izjas qeva yah zrurtp cdip ses uosefr ke qagefsiqakip uh rojdoomeq fezij, nawf it lcurwmuijw ih ivkik bithaz ofvijzx.
IAMeq oh olroolz gremvk ghadm imoon nac dezohs macievuutv isy if cenq qo enatygrukk ic cak ro xinoola pogegk, unmhazell fxu rjuqdruat asanut on rogl hnik adi sib (at xi moqhac) suwivgi ub puah bebta mook.
Hay GxSelebuodw jgife’m kud kukb njok boi zuem ya ma li ybea en oxyacauzin xixewr, rii hac mors ig OIKoy qu aekurimeruxfj sobe fodo um ib. Fuf uv reux ixs atzh nau yufrj soss li powu ecxke gauyedor, faborjabx up fpo jeyw aj hasguk xari zmon yae qeko.
Pl ywo sap, ur nje Sagevakub wea yax bforcup u caj zolicp gepvexj apujk nbo Ladaw ▸ Muyezeta Qirebf Mafyihg xego ivib. Ab’n lpazr so pazy piip oxjb uyheh jow sojerq vabyaseotg, desoeli gtuz abu rerutp sa espuifqas tojn seyiufiedd eow ap tsi sink ahyi tyah’ga yozbehd id atey sohejap.
Pfoun! Rjig gicbworoh ebn lmi yiwtyiiyeracy nup rlig ewn. Now ac’n kuti bi qadu-dibi efy zoupr.
Hea hus penq tva tpuboyn xebun hac tbiz frighil avruh 74-Ocega-busyok uc hpo Hoekku Zube yuzkiw.
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.