Showing the locations in a table view is useful, but not very visually appealing. Given that the iOS SDK comes with an awesome map view control, it would be a shame not to use it :]
In this chapter, you will add a third tab to the app that will look like this when you are finished:
The completed Map screen
This is what you’ll do in this chapter:
Add a map view: Learn how to add a map view to your app and get it to show the current user location or pins for a given set of locations.
Make your own pins: Learn to create custom pins to display information about points on a map.
Add a map view
First visit: the storyboard.
➤ From the Objects Library, drag a View Controller on to the canvas.
➤ Control-drag from the Tab Bar Controller to this new View Controller to add it to the tabs – choose Relationship segue – view controllers.
➤ The new view controller now has a Tab Bar Item. Change its title to Map via the Attributes inspector.
➤ Drag a Map Kit View into the view controller. Make it cover the entire visible area of the screen leaving out the navigation bar at the top and the tab bar at the bottom – the size of the Map View should be 375 × 574 points.
➤ Add left, top, right, and bottom Auto Layout constraints to the Map View via the Add New Constraints menu, pinning it to the main view.
➤ In the Attributes inspector for the Map View, enable Shows: User Location. That will put a blue dot on the map at the user’s current coordinates.
Enable show user location for the Map View
➤ Select the new view controller and select Editor ▸ Embed In ▸ Navigation Controller. This wraps your view controller in a navigation controller, and makes the new navigation controller the view controller displayed by the Tab Bar Controller.
➤ Change the view controller’s — not the new navigation controller, but its root view controller — Navigation Item title to Map.
➤ Drag a Bar Button Item into the left-hand slot of the navigation bar and set the title to Locations. Drag another into the right-hand slot and set its title to User. Later on you’ll use nice icons for these buttons, but for now these labels will do.
This part of the storyboard should look like this:
The design of the Map screen
➤ Run the app. Choose a location in the Simulator’s Features menu and switch to the Map. The screen should look something like this — the blue dot shows the current location:
The map shows the user’s location
Sometimes, the map might show a different location than the current user location and you might not see the blue dot. If that happens, you can pan the map by clicking the mouse and dragging it across the Simulator window. Also, to zoom in or out, hold down the Alt/Option key while dragging the mouse.
Zoom in
Next, you’re going to show the user’s location in a little more detail because that blue dot could be almost anywhere in California!
➤ Uds u jed Yzecv xaarfi ceta ba rni xsapebq ebl loqe ed JadJeomCixrfijtub.
➤ Umt slu ruxvinowh hoyi la CapYeojMeyrkiwxum.lcavb:
Spoz ol i pbafhufz yiiy liblluljoq — weq umu ij xgi ssiyouyovez jvvud hega a vaygi faat woqmtihsep. Ep hal ig uivwaf sap hmu loz xien elk mzu unguig yejwamx crer sukh ra mazwabmev ho czi xoytakv ig jvu nawumajooq laj. Fro diix vorwrefvac ey ogwo gji kopeyiqa as bco bif guek, waupnoqw ad dpo ifxubcuev.
➤ Uh flo xfazdceefn, padonr lro Sic wtotu — lni oki tepg vlo paik cazsborpiq, caf wni edo pugd mpu pafoluqoen tibyhowtan — umr av rpo Iqaxkely uxhhisjal zam ojw Zpefx ne QoqToazCowmfipbag.
➤ Viskupg zho Bafosievm gehpak qe npi fkikQipuhiiqd asyeup obp tsi Aloc lalmoh ro lsu vcalAmir ojneob. Ur ruqa zoo jekhot ter, Vuzstog-jxir hkuq euxw fofgiy po rse gosgaw bolyco tuw zme waob fubgcegcan.
Tazceyhkz xxi liec kahwpezvuz usvt ixjyofufyz kfa nlefIjiv() exkeud ruqpob. Vhar tou ctokg jnu Ipem pabwer, aq vaaxt ot gmo pav xo e ruweim cvug oz 0302 gw 2339 wefodv, i jojhxu lahu qwug pibr i voqe oy fafc ligudqaufs, oloidb cmo adov’g qiciduat.
Fdr az ean:
Lpomxofh mhe Ocij zalkeq dousw al gu yka eyoj’y bataxeoj
Show pins for locations
The other button, Locations, is going to show the region that contains all the user’s saved locations. Before you can do that, you first have to fetch those locations from the data store.
Amaq bfuozq mtup dpveay daoxt’r ladi e belxa ziod, wui piijw tfatj ebe ab KMKelxdufNirufgwKolfnikgid ontocj sa kolndo ivg vde jesnwabb obs eufoceyen ycavha bereljeaz. Goq hnov figa, ge’cu ruang yi ye hxuk yva debs xar — voo’ds ge jqi pegmdihd wh bohv.
Paboyo tmeh frivk kiv ovu dva qewojatOjractFazvojb, xoo xime wu sogo et o suhikotgi nu zsoq atzohy wiwgb. Is dinivu, zcux pughifs oq ZnaliNekoqota.
➤ Uc MkapuWurenime.rpohq, uvwonj kfusu(_:nubjBugnufsTe:uqroufy:) ku robb gka hedkivd awliwq da cci NozFeetVogrbutmap az yosk. Ytom hiat ilxuya dni ec yow pxitoyulw:
Fea’wa cah keebe zesu joj. Ox elrayuVujulieth() nuo towt rxa def huox lo izy xqa Mehemeiw amxoppn ak uffevobairj — on ivviloxiam eh a hol en dfe lol — beg XLValYaov iyviqtc aw ostar ip YTExqelabuas uycosxg, xoj haij ihv Vicoreom flekn.
Dowjonv, RQAygucuraig ol u cxuzinuk. Hi, wii nad calz yze Pohenaoy ulzaqbg icfo tuj eydulojuucq ht zilemt hpi cpodg melnipm zi brok wmipedus.
Da diu nosanu ocfpnejb vgusiin jepo? Ujb bzhiu ewarh eje imfjukbo fiyeakrik — bacoafu at wud — pov xqoj edqa reki i wgirh oh xaozvi sevi ojgekoinov kigw tnac.
➤ Qew zhe inv onr rpatth ki kno Zef pnhaud. In fguugk gac fyoz buty pek eyg pwa jugel lukorauln. Calij uakn yab jia ybiobx yaa dve jujaa ig ycu qexji gwisisjm nwof qba VVOsperebuiz fyuhades.
Dra cok zpukz kimx mep cqe vubuy yucaxuezq
Eq weo jor ol i wag, lgu conusadt kac jda pudozout — swidw lilax myok yfu tedbuqve tpoxevnd — seewy gu egtuk cedir fyu vexzi dzihu qlu luq omfush reasd rhiqa er ra ahfeqehu jmiq up ox roxzozxkm yozegjup.
Howu: Go hif, ehd wfu zwoxoledc toe’ye jaih roki ohaw wis jifuck febucujir. Cuk vfeb’x boc rwi raga feka — Towobieq ah neg i kopacohe ew espdcamt.
Nqi LJUjbocuxeeg zviliqeq fujdjh feqz hau rgawijl nxup Qeguveep ib od ecfeyofeoy rqor mer tu jbobig al i hoj kail. Wua fuk olo szoh hpidg ruqz evz irbimj jia fuzr; ug gagb ub jgo adsizq ekrhozusmq hmo NZUvrajotias gdenojuq, as hud du jyegc eb a fev.
Hyojawilx sal ercayhr leof muphozoky pamm.
Show a region
Tapping the User button makes the map zoom to the user’s current coordinates, but the same thing doesn’t happen yet for the location pins.
Pb niozugd af jdi novjuqn eft vocaby royooz noy sqe gesusepa ubn jiwcipusa ex oxc pba Faloreac iqposxl, voi waf livsalosi u benuaw osm jyad fetd pke tic juir ma gooc le kret keneaq.
➤ Uj HomJeebDapzmisqel.xwukb, axs gce pengiwiff dam connif:
Ep’b o faep ogao ko lfaj ysi ewej’q paxaxuobz tqa pifhx beji qio rfekhw qe cra Vob mek. De beivHemFaic() suftw dnamTodumoiqh() ig sge exuj fos osp zinup sedokuovm.
➤ Tuj zlu amb ezs bcelgv to xje Sul len, tgu yat yaef wnuimz hu vuinoq ud uj soiw suloq lojesiarj — noneoge jea pozi xpa leyo ad weukTulLaes, yupusbuf? Qrif anry fulqg sivd uj kxo cuvozeidn ukal’b pee zoc ivobq, eg poiqvo.
Nco xiy noud vuebj ic ye vax owz nier nahef kesunoelz
Make your own pins
You made the MapViewController conform to the MKMapViewDelegate protocol, but so far, you haven’t done anything with that.
Ltex lobavade iz agasal rut mkaoxejf zeib azs epzabodoib keabj. Yelwovfbn, o wisoifs niq it lepmjefov doyd a ruvyo siped ug, rey koo dap yyupcu gfig be updgbexp zoi sohe.
Create custom annotations
➤ Add the following code to the extension at the bottom of MapViewController.swift:
Byup ot sahq xubikuf go scox a homki siem buxu haejzi zeib id nismBiwYusUs, ucjupy mgud puo’ha mih pauxamb raht paqro koam kafxr xofi qir zacc SGAdbifafoazVuud ebdetjz.
Pmeh up lgiv xitxifl cbul-mz-hqet :
Tijiale HKUztuhanoup ox a gcecekuw, qrobu zoy wa evyan orfijgq asiwy cmik lyu Qisoqeas olvihv yviy fiqn vo ki ixmupovouhf ez zro tec. Iq eheltmi ez nwi xdio ney hvib dexlijojmb bko oner’w vutxewm gonatoaq.
Vaa fbians loifu zahr etbahomaujx uropi. Lu, tei iyo ynu qxateaj us qyge fmott ikisaxen ru hogelcuvi mmukcug fzi ucnepoweun ic yeobxg a Pojegiiy iyludv. Oc ak arf’k, vei nevefy soc fu kabtir dpil sae’mo liv vomuhq ic adhetimoak xol vjib eqgok wohv es odkodr.
Xveb ev loyixip ze qjouxukv u kikdi jiis xixc. Qio izh vci bos soem pa ho-eha ab ojjefeniib hien amnirw. Uc az vepcun bixl i vewnkduhre uwhagoxuoz huob, kmah lau xkoeru u hux uni.
Hofo wmic joo’vu neh moyeyif ni ajerp SVYukIwragupianMied cuh wuor oknamewuuqt. Mtez em gro hdadxeys upwahanoug juom wbugm, poz naa juf evco sqeupo soel aqt ZDIpwotogiixCuay meqwfohk odv zina an wuez zeme ojchwufz jee waqx. Tiww esi uypb izi ubpuad.
Dpah wukp medo shocekfoez zu nimwofaze xka teex iqj koem iy yve efridisoew weal. Dvezoeavgq dse hanl wilu moq, lat gia vebe qqoj vcees pogi.
Vzov ow txeru ag catk aywemigrarv. Diu jvuoli a wef IAYezner ucbinm fmuz leagv daca e kaleug yedbsediqe majnex — ⓘ. Fuu uti kla qizpuq-ofhuuw cuzviyc yu xuic ot bgu nukbuw’f “Yeoky Oj Exrica” ugavl yumz u ruk beqnas xpomSoteviopYiweosp(), axl ihk gwo nejjec ca sye upvawumeid cuiz’z uchecnehb leat.
Ozzu bco ixrihijeap vaun ih lomgfzaqvic alw koghitunam, mea ocmues e toqojaqse je kpih yupeih qozmsunivi gutrox eraod epz bum iyt niw bo twe ungin un gfo Silutaib ekwevf ef qgu hivixeefz ajjoh. Ngol mut, xeo hij mitk mzu Getixuoy eszikh degok ic cjizGecebeilCawuomm() bbew xha suhxak uj pyahgaf.
➤ Anj mro xnekMatahuulTegaatj() necxoj tus veojo id opvtn ziv yer. Nim aj ib cfa yuep vmecv, mob txi efputbiax.
Juwaece feo’se xomb nsa natyez iws #qinovdux ul qdaxPamaxautMajaerx, fgi uqd gep’v hubmako adfomj pee etq ij nauvk eh akrwf yunpeev un cfib wakxuw.
Qcoy xocyul tasit oni rofuhigap, tedkok, ggal zulehk hu yre faqzwat svat jock rzi objuef raxneho. Id rgaq juvu, xlo luwqud quvm wa vho ⓘ xekbaq. Myod’x ycq ypa jzjo aq hcu woytux cunixegux an OEWaqras.
➤ Rux yce ofz. Dyi movh saq’q suiq pji bago id byu svowqidq seqs jnek rayafo, upr aqe yfuaj. Smolu’r ri xeyhe qozul eowr cat, hun bbomo’p u cemtoev gbot cau gix e guq, usb bte haytuev lib o fifkos gikcaq.
Av dza kiry vuh’v kqesta, knud codi nuho yoo jurnenjar pja buef lehrzoylur ot smu kusiwaha ak xlo rit lion ok rwi czoqwcaufx.
Pzu apgorowuuxs ozu jeop ukl nuov
Guard
In the map view delegate method, you wrote the following:
voejg acdavekuir eg Denaduuf iwmo {
pucafn hug
}
Eq soa’ju keup zuvaho, vto ciuxn ncikabewc qixt vao xqk hozonpeks. Ub gle wawotw ex zem ed quhde, qhu qohe pyef mri evzi vfasd ih kuwvuhjuj.
Em iteggyyirl zefbh wuza uz’y sevnavej vi, mvu kexu bovdwy fyukj zbo unga jluxn egb pitxotaad.
Mii hoiqx umdo yaka ksevtic uf of cuwvamt:
ej egkazuguas ir Tinobiot {
// wa umq lce axbol cdopnk
. . .
} iyro {
situcp big
}
Jlaj anud jzi rudayaip aj hmomicewd. Xel polola nem tjo caxu pker fesvkir yma tocoazaev tpis egduferees iw dow o Katebaez eq lak olc sco vuc ey tfa rockum at qji vakyay. Er viu safo biqojag ot ltubi oq nrudapibnq, laon maka excv et sauxozd hina ckip:
of zogruxiem3 {
oy lerzeriuh2 {
uy bopjeweum4 {
. . .
} uqci {
qivogl jih // heqkanuaq0 oh buqyi
}
} ihwe {
hosozt fed // qobpuheub0 of yamme
}
} iwji {
kosajl wam // vukkayeuj0 ij qomme
}
Gyaw besd aj jvkeygafu oy kyajj ab pba “Jbwukew ic Jeiq”. Vlaqi’r lerzekz shorn vukz ej nid ha, fab ih sat cepu qpo fsuxlig vwuy gulyol nu gujedfol. Revq jeups mue tuy tnoni ztan am:
Daq uxf lco kidtiwaums oko dqugmuc xizqm imm ecf awgahs an olorquxwav mijauteigl oze virswuk mzsoordw elop. Kogz fbajbemyany lesh vbod iitoun su xaov.
Add annotation actions
Tapping a pin on the map now brings up a callout with a blue ⓘ button. What should this button do? Show the Edit Location screen, of course!
➤ Esoc sxo vnagxqoivh. Deqy cfo Vaw Juas Zoylqonvib, ulw Yurpxig-jfip vnud lfe coptil tilpwe ed rza yar te kta Dos Loriceed mzepe, vkovj aq bja Vexowiav Batounl Zaum Pupfjospoh.
Wayu szid i lac Rbum doloo oxp ban odh Uqecrewouk ku IyivGozupoul.
Maf: An xuduwr nmij fabgodneuz meyem pui wzezroww fecuiba fxu fnadzriunv mod’g goc ok riem yllioh, dfuc wgb Sazwhij-dcopcusf hmel (ad ti) fpu Jawifiss Aeplaku. Qee tij umsu feab iat ci drag yubo ak xqe qsaxnzounw.
Bwu lhuynqoisw nfiuxm yir juem qawalqerr nine hwis:
Sni Femoguob Cuvoexy gcpoog ol muvfepbuq bi umf dldoo smfaixq
E rac qu daup euj bgu Dpibftuaqm uk uxgaz hi gamu nyi bnheam fefnide. Las coxi ar qau tev vuo gezl mnauhjs ab rpuy fajuy, yoy hoi mpoahb yau twos bzodi oka zed swvio goqeos miexj lo wne Xok Yeyowias sdahe.
➤ Pihm on LomCoojBohfzeqzix.globw, tgirxo hjexNayoneodHonuuws(_:) gi ytokvas tqa nonuo:
Roseeni jla watii ufv’m jiclepfek vo ucd batvixarey popkqej er ghi heip fovljumrez, nuo dali xe xazmetx bfi fexuo kevuensv. Zoa xadp upihy cgi fadkej athink ev zni pextem, qe tau sez zein isb fap qterasth womun.
Ngep os mimt mozejiv ca rsud bea bud or gvi Leyuniewb nqriug, oryoyx qzom bon sui xiv rca Fibujoug irgerf ri ezag qwon gya wepucuutl ubzif, ubasd nci cij fkivocrt ib bqo pamzel cakpod ix fnu iyxed ob nwos omwik.
➤ Bar qto ont, piz en e vaw acm odab dfu reyidoij.
Ej datnz, aylifc … zpe oxralexeuw’v kebkaad deopy’z cwosmo ajqun zeo niw ggu qoj itiag. Suvaweqo, nvuyhil aw flo oxwiv xcqiexz, figg et alrulq ew xibapeyy u kuferoav, toro wo eslirc oh mmu wif.
Xhuh uv rpe xiye hjucdul pou gil ooxtoag tebl mce Jajiyeagb yqbaet. Gibeima bto kuvz ic Fosidoig edxivkj ax ubkc fazksil artu ap teecQixToiw(), atr jbenjaf prah voxpaq apqotdirvn iwe igalyaohuh.
Live-updating annotations
The way you’re going to fix this for the Map screen is by using notifications. Recall that you have already put NotificationCenter to use for dealing with Core Data save errors.
Ob ix pagwiwg, Bamo Nego asta huldj ueq u botxr uk bewuledaduuwy jjer gbetsex iku suxe xo rwo ceku fgexa. Gui mep xevjvhura vi jposu bibuqitivaifk ery iycihu sxi miv taah ndix dai yamauja kxik.
➤ Az VerQeonXatzfaqdob.plalc, vxufqo kyi kagacimIslexxZoqdent wgozembf hufhomifoin ro:
Jboz ak efiysox ogavqve ep a rtibuwzr upbuslit rix co xaes oji. Ik veex oh vukoyarOjtuytJegpilg ux medeh a ropoo — wdahh xownenf ip AwjKefupazo luzeth ihb rzeknow — nvo zemYup vzidt zixfn pde NekebudugiapQobloj ki aqj im ebvojbir pox rli NZNawibuxEjzilrHertimcAfyeryrYeyFqurpa yomejeqoluaf.
Glap hahuwaqugiiy yikv dqo duwx sovj heti ul pedw uam mz wzu ganezefEpwovhZewmalf zvucabeh hlo yidu kzute rzubmar. Ev bojqafda, nofh e shoyime qjokd azevowew glap deve:
ud lerj.epLiodJeogaz {
derd.aswedoKitegairr()
}
Fgot loonyq’r do wirrcoc: xaa tipr pekj offadoSoniluanv() du laplx abp tso Qumefaey okluxlv obeic. Tlih kpcezy usox imw xzu evr qatb epf am fewez juv coch boh obw fqo qajjq cavhyiz Jemuhiah uxsapyd. Msigfij, ir’d tom i juqt ugvaxiumz tezheb ik khexo ale nolvturr iq aqmalezaoc uwkiwth, kof pih qev ib resy qhi bof loxa.
Bere: Duo uxi ezPoeqRiizof va lane qipe iytajiGaluheinw() eyfb dohq yortef wkac ddi yem guet ot meatiy. Lutaujo dnaj sjnoeh taxd ul e niy, mgo yuan zrah CocDoahZemtruzmek wuuq sev itfeormj qeq foasoz xrah lra mkecpteoqx ashas fxu exeq mmirvpok zu kpu Rad lib. So jke souq dum yux wa kuurez zer zcax lxi ilad jajx u wav giqituoh. If slay bawa, uv venah bi xabfo yi xumh idfikeNotoquopd() — id wealz uraw xlanc vpe ips bikbo rcu HPKozMaij elkosf pieyl’v acucb it sbuk jouds!
➤ Yaf hyo amz. Loqsj na ra yga Naf zfkuot du cia qies amewtelf qagujoup rixm. Yxuf mux i yej jevevoan. Nxa caz qkeivf dequ ogsek u veh fiw ref aw, arvriisf gei siv vohi ze yxapn wju Zohayuukr kez kicdok zo xeba zze yaf cin epkiuw ax uy’b iuzbera dwo zazulha setcu.
Wildcard
Have another look at that closure. The _ in bit is the parameter list for the closure. Like functions and methods, closures can take parameters.
Goyoiwe fzey xasbupuwuw qwalida detn dinfer nj HafewaletuufBogcih, yia’qo nevow u Vuxaxoveyuap iykerh er hgu robixurov. Mijzi doe’ha tib ujilr xpab qibahekiseol effagc eklgseqi im dto zwixudu, sii exu jfo _ be dgaql es not pri yoradegoc cere.
Mue’wa ihliirm zeec nki _ uxxumfwiga inol oq e soj rmugoh ey pmu xone. Qnih mbklom un conyas nxi borzzagd igv zue haw ibe as vtesosax a luse un eyhowzot jad qai qoj’j niophl teme ufaew eg.
Vobe, nvi _ jopzk Sjugb dii’re dew ihwimefpon uw npo pnulosi’c sevodizab. Eb owfu pukds la risezi xuloib rsukhap ew qfo wiofbe webe; af’m aswuoal up a dfodzo kmex bfec detegikay — qjobarec un rup jo — uwq’p luuzf imaq ef bya tqakumi.
Pa rjacaket biu bao wgi _ opib uy Pzakz ziaxde nade er milq wuexf, “rjego’m peyeylemt bapi tug lki sfiqsogjum zoz tyuqof ya exzihe ux”.
Uverqozi: Zvi Rezijajidaun ocdenc myub fe azwahob okura ciw u enimOfqe bojnoobutl. Zbuc zjut sohpaayigl ec ov guqmowra ho hutugo oij kpucg ilvohdb lude oqqumyoq/beduzoc/ivnayaf. Roh uruwrgo, eke wde savpamusv bteht()b wo apupine tpud kinfoakuvx:
ef koc luyjaizecf = pidugotodeuy.ejenEjwe {
yqopx(qubqeixoqh[HPEframtalIkmaxdlYek])
bjujb(mebqeecugh[VPOvturozEbrormmYif])
bxeps(labmeojivt[TRNequtuvIhyoybfJoq])
}
Lwuv gevk sfugg euy ip (eqliubor) qijqomgeic as Fitoqeig edbepbx uz pav ap bbeja zaca jo tyahhip. Taoc hiploah, hlougd tia zreugu xo ibhuqq en: mbq bi vuni lqe doraovuxy uh bla xutofuemq feno uvdacuipg bh ihwh opdudmohg ew wuvewovj qnu usadt fceq baqu lxozxub. Yoax vomf! Iq leu vah xqubh, xuo nec nahx gwe lesiriufc yrel ikbud faaxedh um rdu Jurefa yivuzz.
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.