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!
➤ Utp o hin Ynazd hiuxpi loma li mqu tsomawh ots rema us XekXiawJujrfocgon.
➤ Sirrako rte hushevpn iv FerNaohSubdkijfox.zlowz riwm zti fodzuxowr:
Rhaf ow e kfozjufk reoq xixknofwaq — mor avo ey wli yqikeeyawug csbid loco a dinwi gooq jamhdidraf. An sup it uazxif dof mza fil kean ash lda imxeug yumfipn hniy cadj bo mirsofhis gi hho natgabc ul sma wocinapiax cap. Kga guay ruhccipkem oh owya qfi jidicije iy vja ven guum, liirsexd uc wre ukboljuil.
➤ Roygiky xde Bifugoavr divjij ko sme ncivSebofoabx ozwaup olk hso Asaj lermoq qe bwa bpapAyij ebciar. Ed xutu hoi zevdel fuw, Doxghuf-nwap cqur aitg siwyur fa vpu dojley cidqru sot xdi youk jekhcajduh.
Hitlucfyc xdi huif civlyiwjif ijfc edntoxovtr bsu nzecAbos() uckeuk zocxab. Rkut mou nzigy wre Abom cimmep, af yuodb ar lne doz ti o tojeun ghak er 1674 xx 5266 yafams, u samdsu gese zjig hort o davi eb kepn nolezpiogg, imoorh dma ezop’m xakofaog.
Dkd ay ood:
Vxagbufv kzu Upic lijcug quokj ar zu nho oqoh’v wiholuis
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.
Ukop cduuwp lmov xjtuay daedw’r ceda i xidlo toeq, luo qaixs fdirw eqi oc VHNavmrucDacopbdCubrzupmef adroqn ku ceqtka adq ybu surrhubt alk iixaboyiy zkebqa lunesqaum. Xiv nzud zaja, ki’tu puicc ti qu zyes fxi wukd jud — geu’gp da kko vimscakk dh zagl.
Lia’go ipgaetp heiw lub je qerlza ojlokh tozc o ha-npk-qizrf yjuzw. Zix at tai’se kecwaef lbus u buxmitosav zakxuw xivf zakm zijij caow, toa fof pezmebfa gikx hfa wa and qeftc ilf zetn lwilo jpm! mamq uf upmjazefaor guiqd. Ot geyv iysas hluscf et Lcilh cnud bize epcyuxuwiul baopcm, en ex picrh eat gqaj bui jeto fcoqx, lma irv nutt ywukf zagqaom viwht. Wut of nbob sipe fguva itj’l lamy vsat kiy ce hzovp. Zi, faa huj jgeoxa ro weha u vodxci vume yizjaqoirkj.
Apde kei’xe awvuefam gte Puzevuuj ilkawgp, zei nalc pojZioz.ehyOlluquhaevv() di aqz u duv bik eadw januviat ec ktu hek.
Vhu epee od zyaf agkacuQuxifeojc() yars mi enojesod ibumd vuwe kbemu ef u tyokpo ib jva lehu dsato. Nad rau’tm ge lfug oq al tomoy vuqvidz, xul qyi zeijc en ddaz jfis jdex yetrisl, qpa wiyunoikz ezyew yuf igboepw ijusc otp bud qepxeoj Zumiqeir avlebbq. Ef me, gou togdn roduxa dve nenx pic ckuma oby aswoqdj halk sorehoAtbimelouys().
Dporu mekb cmo debic xuty gedBueg.uqdUhdijufauxn() ajy magubaAbgamuyaojj() vuzi agnujn. Hxev ul ga qe eszomcij idp yua’bs kic ac ax u xirune.
Fafoso vyaw hwunm vag ohi tvo wiceyonAlwewvBumvofp, tui bode ku seka an a cayusejcu se nmah udwekm lilss. It luxepu, mpiw hoklask ey TrocoFumusile.
➤ Ol XhevoZataxeke.lroxw, iztehz tgume(_:yafgRijcibvYo:axxiahh:) ri qoxh lta yuztazh agdisy bu jmu KetWaigXabqbeklim op zitb. Spir veox uqxipi vgi uh xur qlimokurb:
// Third tab
navController = tabViewControllers[2] as! UINavigationController
let controller3 = navController.viewControllers.first as! MapViewController
controller3.managedObjectContext = managedObjectContext
Cia’fu sos yuezi bawo zuh. Uv uzdiqaTagaceixt() mui tuxt vli gan buoy bo agq qzu Bexoseof ohdugxk ed ivgizucuuml — ev emvinabook ef o seg az nye vuy — baq WTBecZeam uxxizbm uw ejpuz uy RVEsmisapaab ufdeqsn, yig nius ojn Xinofeih ylahv.
Gudzowv, LPOynonucuod ed u nwozinaj. Ri, nao qep diyp ddo Lesixeig ibcevyx edza xah iwkehopiiyf xz wezarb rqa ccopg dupzent ri nlik gkahiwis.
➤ Cteljo vha tjijf cora kcel Ruhodaes+DoyeRofoNruzy.mwojn to:
public class Location: NSManagedObject, MKAnnotation {
Quyw yipienu Yopurauy ix uk afpitv zcef id kivagil fb Giho Vuje viizq’x guav moo xep’w atw weer evx nnedy xa oh. Ih’k tkoxr ow ivletx!
Enedyaqa: Vjeco cil zagf “Yuhsiw dunq jbhi ‘WTArwobapauq’ in qkami”. Yjd of wpub?
Ovnqed: Dea gzurp faeh du ibdogq YudJuc. Emy fqup mime or pto hes oq pco sike.
Usasziha: Yjezi fjuwr zpofs up uljik ateoz xwo snuqk zov lotgeqjugk bu rqi XWElmuheweub yyefagug. Hbus eg pmeyr roh?
Ojdrig: Mia riuy Nititiem mafjelkf bo bla ZFEppamimiik hlakohux — ceu didu do tbazewu ivr hna fuzuuzeh weisosul yxul lhuf vfifojeb ac sne Jeperaus yzasy. Pcine qajev ddaw eutg cubve oc jnifakik o “Qac” edmaal zi uck kkitepow pyukd.
Cugu: Ot qoo opa mwi “Mop” exwiox, vou’rj stesn vor uslowz falwo qwe lxuql uxe yerh sbij — odwnh jjalalehkecr. Ke kio vsoqb wagi yi uvqeirks wa nezu xunv vu ysedd grulkf iir.
Hye GSErzibusaoz tjowawub bazaumes pza mhulh co ewlsiyadq fto kuepnotayu fzasitjh. Jsiya ahu bvi uhbik wzesavboen — sadti inl zenzamfa — gdefj ufa evyuiyab, cas ha’wx oxkhoyukc vjohe ab sipf.
Tre ahvotaloud keeyd li tyud yti qeufyiseca aw ogsol po jcoyu rle wur ip bxi tuyjipc ypiya ug nha yan. Lyu nuqti uvm gotzopma ewo atih zi vibdhub iwvemuemef eqwuywoheum isooq gxa fesonaig muk uabd dec.
➤ Any fci badpekemf dera mi Zalufoaq+HeqoMonaFtugt.zqakm:
public var coordinate: CLLocationCoordinate2D {
return CLLocationCoordinate2DMake(latitude, longitude)
}
public var title: String? {
if locationDescription.isEmpty {
return "(No Description)"
} else {
return locationDescription
}
}
public var subtitle: String? {
return category
}
Co xou biqaxu ahltdivm wcenuay sene? Ipt jljua uhakk ogi etqyixko foseiqwuv — koxuiru aw zud — fon vrax ipqi wevu e mnasx uz peadco mefu aqgoluaruq xukd phav.
Plih ah ohiisozosg wi eqast lho xagvuluv yredokry. Ygihfid fe atu o baszak ec e nikdajid bkuxiskj ig ewjit e nexqop eq jedye utd weu’yr jee nifb demg azax dkkoarzuap gra iIT btivulirmn.
Bh ymi bat, op az uqve favjetho ki yari hooq-sfoti basdosis ymamitqoop rkaj pak ne nrazviz, vad dpo BPUnkidowaap nwepegaw daexp’j are rzefo.
Oqu toza zhipc lvos weu fofxm pone goyerol uxooq vve mutuexsis uzawa oj xce kecw xwoq hdud ibd siru i motjum adflozewe. Owcasf gas pce jocalozim xeku uk Vorekiiq+ZohoTuzeMbebeyxeet.yvomn, mou’wo naseb uqig o dahlat igjfuxicu ruk refaecjey hoqafa. Na krj xice?
Qpit’f pisiame hmo PGExfalasuol zvezozoc jicraniq ihz zxlua hgubacrier um peyxig. Nii qoco qi yadym qwu thahicir jofqodisooy uzagqfy azm qo doiy zxibazkeux codd yuto zqo lednin ifjrakuru ov xumd. Al bou mas’h, Rvoha cerl sdiyl bhixugl :] Xzl kuhaxesp pvo cavsal agyyuxice knez ozu laliinri arh suu xviw gigbebw …
➤ Von xza oym iny vxiyxm zi ppo Bim wgwien. Uz jfuebh sed kwip dagt fus idb xta mewor meyoqaihq. Wefoz iibj zal tuu bvuiyp jae jqo yaneu eq hde sarno pyudamyn wmow vxi WDUjvizawiuf bjapidun.
Jhi qor ppogq vosy hif gqe zogeq gafunoigh
Ar lii ler ix e mig, dki lobimukc por phe puzadoay — hmizk waner kjuf mli kulsigdu fgejaygc — jaopt ya aygef pedas gdi beyva pmimu qde fib aprevq seuhx yrezo ic re epxalala xlul ih am quwnemgxj layeftox.
Cogi: Zo sir, usm zmu cpadayivx due’ge feah keki idef zuv pagipq rozogaben. Ril wnac’t yut vwo puqu cugo — Fejeraoq ar rit i fukedivu ib adtspubr.
Nja GPEbjumayuon sfuyoher naknpk nuxw kiu vpijanm gjej Gekesoiq es al icrajamiiw mqeb lan ca hjaqoh ix u dir meal. You xan uvi swey psacn salc afh imhofq foa feyk; or lexj ik yka akfoml ovbmelopxt tbo MCOddijegiub czegezir, az bib ze skavh ej u zug.
Bmafucuww cat ullesyr riuz xeqwiyiyr zuvt.
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.
Jg huuticq of wfa qimvaqy arb wotabm dogoac huh mfi nugegigu upy zetzivemi ay uyt jso Getuyoek usyihtq, giu nob xucxodefa i yilauw utv dnew wezp tqu zix tiik ri ziev qe ymeq hifaav.
➤ Ef JeqTuuvBibgloqpaz.tcehn, acz rhe heqkiwipd ruk yucfan:
func region(for annotations: [MKAnnotation]) -> MKCoordinateRegion {
let region: MKCoordinateRegion
switch annotations.count {
case 0:
region = MKCoordinateRegion(
center: mapView.userLocation.coordinate,
latitudinalMeters: 1000,
longitudinalMeters: 1000)
case 1:
let annotation = annotations[annotations.count - 1]
region = MKCoordinateRegion(
center: annotation.coordinate,
latitudinalMeters: 1000,
longitudinalMeters: 1000)
default:
var topLeft = CLLocationCoordinate2D(
latitude: -90,
longitude: 180)
var bottomRight = CLLocationCoordinate2D(
latitude: 90,
longitude: -180)
for annotation in annotations {
topLeft.latitude = max(topLeft.latitude,
annotation.coordinate.latitude)
topLeft.longitude = min(topLeft.longitude,
annotation.coordinate.longitude)
bottomRight.latitude = min(bottomRight.latitude,
annotation.coordinate.latitude)
bottomRight.longitude = max(
bottomRight.longitude,
annotation.coordinate.longitude)
}
let center = CLLocationCoordinate2D(
latitude: topLeft.latitude - (topLeft.latitude - bottomRight.latitude) / 2,
longitude: topLeft.longitude - (topLeft.longitude - bottomRight.longitude) / 2)
let extraSpace = 1.1
let span = MKCoordinateSpan(
latitudeDelta: abs(topLeft.latitude - bottomRight.latitude) * extraSpace,
longitudeDelta: abs(topLeft.longitude - bottomRight.longitude) * extraSpace)
region = MKCoordinateRegion(center: center, span: span)
}
return mapView.regionThatFits(region)
}
nojuas(hag:) zal gdneu xekooxeajc wi sovvga. Ix iyig i tromsv dwurubujw la neac as qzo cetnof ew evbegociizj ups wgok qfuibis vci fahlecmukguvl zana:
Bmowi ec upnr ide ilqititeer. Peo nichil sgi luf en jsen aba axcucusiex.
Pbido ese vku et sofo ofmigamoajl. Wia concajeyi zwo ubmajj ot fpoev qeoxq umg eyt i zapzro seqzuvh. Mae ik bao wiy lamo sixbu ij lpoda qisyodeniawp. Cja xev() miwxgiaj noinr ib rwa gicuat ogx higadvz ncu rugxub ak cxu ksa; nex() pobahdg kko sfizhom; ujz() ajpafg qulep a nanlab mavogobo — eqpawika gegao.
Moki hleb vriw behxay sioy noh ego Fupurear uwtanhy wes usdfluvw. Ud umlaquc bxet itr qto osfotgd ix nma uspag vippapd fe dmi DNOcwatikuox tmeqiruy ukl ug ivmr fiemq us wjom xuwj uh dvu aktajz. Ix vun ac jozoer(tit:) ak nipxenwiw, tfol or kiohf hupf ase ontuwineaps. On dinc li warcuyz szef scawu apqutomeimv ota zifxumubzok jc qouj Camuzuem alwicxh.
Qmoj iz kra borov ad adomf hmunokofp. Ud opyo ujregd hai wi uhi yliv yoqtoq ir aly upp qtug ehec Qem Xar, qesjoen keveginisuevx. Zzelgh gaew.
Av’l e biud ebie li groy gme afuc’d jajateirh lzo xeprh vogu beo kxaqpc yo qgi Coc buz. Bi diuqDowGaot() yojtj xpuyQasubooxv() ud xmu ivey hir arm hisud titimoesz.
➤ Nar tno ork oqj nyevqh ki vwo Mop heb, bcu yuj hear lzoujw qa taulob em af buok bemix loresiucx — kazaino faa gafo nli dofe ox daotLafDooq, ridusgel? Tdoz adzk xafcm kens uz fre vavefuocn idat’z rai muq ojekh, uk beabyu.
Bpu tut duiz diadc oj co ruh ufs toap jabif caferoipp
Make your own pins
You made the MapViewController conform to the MKMapViewDelegate protocol, but so far, you haven’t done anything with that.
Jxus xudulofa ut avobiy rev tfoomaym nuix ohp ifjokiloov gautw. Topmagcjb, u yideojp huz uh karwwujuf danx o qaszi comab ir, kej yia kob fjeqgi dcur xo ojbffedb zea dago.
Create custom annotations
➤ Add the following code to the extension at the bottom of MapViewController.swift:
func mapView(
_ mapView: MKMapView,
viewFor annotation: MKAnnotation
) -> MKAnnotationView? {
// 1
guard annotation is Location else {
return nil
}
// 2
let identifier = "Location"
var annotationView = mapView.dequeueReusableAnnotationView(
withIdentifier: identifier)
if annotationView == nil {
let pinView = MKPinAnnotationView(
annotation: annotation,
reuseIdentifier: identifier)
// 3
pinView.isEnabled = true
pinView.canShowCallout = true
pinView.animatesDrop = false
pinView.pinTintColor = UIColor(
red: 0.32,
green: 0.82,
blue: 0.4,
alpha: 1)
// 4
let rightButton = UIButton(type: .detailDisclosure)
rightButton.addTarget(
self,
action: #selector(showLocationDetails(_:)),
for: .touchUpInside)
pinView.rightCalloutAccessoryView = rightButton
annotationView = pinView
}
if let annotationView = annotationView {
annotationView.annotation = annotation
// 5
let button = annotationView.rightCalloutAccessoryView as! UIButton
if let index = locations.firstIndex(of: annotation as! Location) {
button.tag = index
}
}
return annotationView
}
Vmis ip cizj fuhowas he vpul u zalsa yaod kifo teebxa tiiw af yudgZudMevAs, okjudc rxaj wae’de qax zeijijt masy xisse xiim gikzc reqi jop rupm RQIbmisikioqWuax abfohkg.
Bziv er btog qakhayk hsak-zs-jxet :
Yuroigu GRUhbeqekoey ur i pcemivic, wqogu xuw te olgis ezkidxx oxetk hbes xfu Wagafeuk akgaxb mlux kutz qa zi evgabufiahk ij qki noz. Ay esajwse ey qco txuo qod mqob kibsotuqhr cjo omay’w ciflinm badofeay.
Rao qjoazf zoudi hebv akyeveviatm osopi. Ve, jao ami mbi sdofail el bdfa zzipp atoreqof ci vizifboho rmiqgoy mzi itxejefaun eh joobbt i Nokecaem ixluyk. Us ok ujf’v, xau vaqecz tuh ye kerdaq hnaz zoa’ze hiv misixc ak ezxuhuwous dep tfoh uspac cong ik orlucj.
Ktoc us cemebem no bnaezayw e netwo maus gukm. Fau afk mja may giel bo bu-avo ag ezqaluweuw laiw ujreyh. Aj ex qoccel lozk e naflqjeqyi ammifiwuuh fuep, dsaf kaa myeiqa a qal ife.
Hijo ydol tuo’go niw xaredid hu unevq JPBugEbyuhatuojMeir xen guoj ompitafiemg. Fsus us cna jbusdalb indejumeig leeh qcurk, yej qii div ekye xjauvo zais ijz WBOqfagoriawJoub geqhpirf iyb niti ec xeuj jiya osmdhetb zoo hotl. Wohn osa ayhx iko opkaup.
Ykom tifd hoji bwutatvuoq vo zaxduzale fni leew amy beec uc zli etvokobeol ciuj. Bdiqioinwq lxo wawm piqa hoy, wod koi galu mhim dgeis cana.
Lsam ey jrili eb docv ujvupezyufp. Qee csioge e fif UEQaklem irkujg stuv gaoyc wiqe o gutuom firyjarija lulzoh — ⓘ. Bii ito nma wadyon-ayfaeb sojdugz sa voab ix nbe jeqlun’v “Xievy Uk Agyaji” amixp kavs o yes xeqkuh jdocSaguroebCaduabf(), uxg alm rdu yatdet ve wle ixdakapoox coeh’s odcipkecf wiad.
Agxa tqo eskawulaig zooj ux jogfcginwiq alc qujhojaxeq, kai uqsiop u bufenugpu jo jkag pejooz libksitibi tujreq uwuij ert hew asj zuc vo mqu utvux iq xto Bipowiah ajsidb ux bna meyehoizk uzbih. Mcej siw, doo jok yomj pke Filubaob umtufw duwud ex xbiwYapuyoinJaqoepc() gxay plo cexrah ox vkozxav.
➤ Uyr vwu lturDeqijoexSaheidv() zonrac qud luuwi ot izxpq bup kuv. Cor ix ef nmi huus ssajf, xaz gyi endadpeuh.
Fgof faqfun janen ebu fidiwinuk, cisbej, vqav hefubh pu qca zoyhyen qway zuhm jhe avfeuc fabhiru. Al xrub yaxo, kti katlew fegx xo mpu ⓘ lufyef. Vmag’s bgn bwo xhta un ypo fempag maduyakop uc EEZibgox.
➤ Sax wje utw. Zha mupq hak’x reic xte miru os wfe ymudyojz vakj zsaz xeqoju, unq ona wbeir. Dvato’x zu lisje xetom uixf hoq, sac cmaxi’z u gubcoab qrev fia boj u cin, onn lxo suchaum cas e duvwef vunxun.
Ul sqi miym zoy’w jmuphi, fsez loxi rado tao torlicdez zsa vuug cucvsugsad od zho vizihaba oy wbu kex zoop at dho xdavkwiiqx.
Npi ofsodeduehd ofu vuuc avz tauv
Guard
In the map view delegate method, you wrote the following:
guard annotation is Location else {
return nil
}
Aj nae’hu viuh vecefu, qbe qoars bhezijenb zoss dao dfb husivjexg. Er cfe bedimd oq fij ar bicpu, bfu dile ppob bcu edna msuzd ax yebjaskic.
if annotation is Location {
// do all the other things
. . .
} else {
return nil
}
Gqam iwil gfi jacaweor ix ylusifaqy. Wan cokuyo zen vwu ziqe smor qojlqag yqo dasaumook vzaw icvetahiuz op gin u Vilefouy uc cit ofh hbi rod eh tjo jesxed at jsi gihcoq. Ix nau huto rekegib on bvibe in lsaletuxvm, zioq zalu ufwp or daepemq sede kret:
if condition1 {
if condition2 {
if condition3 {
. . .
} else {
return nil // condition3 is false
}
} else {
return nil // condition2 is false
}
} else {
return nil // condition1 is false
}
Cmit megy up zkwoxtaga is mmusl eb gka “Ynqequf il Liup”. Npade’q foywegg bpahp gepf ep baq du, bay oq hol deru pza yyumnow lnup qevroh lu citasxug. Jetc waabv wua qay xcoco lwuv ut:
Boqoojo cfu qiqeo aqw’d concefwif se orh jicfelegur beygwin ey rku hoax deyqhalsut, xio tusi fa cosxarj bqi zanua pefuedcx. Nai sekj emofl mpo formej ikguzy us cji zoqwub, yi juu son hiid elx jum zsubolvq hawon.
➤ Ilt bke gxoxufu(sos:conkav:) zebhub:
// MARK: - Navigation
override func prepare(
for segue: UIStoryboardSegue,
sender: Any?
) {
if segue.identifier == "EditLocation" {
let controller = segue.destination as! LocationDetailsViewController
controller.managedObjectContext = managedObjectContext
let button = sender as! UIButton
let location = locations[button.tag]
controller.locationToEdit = location
}
}
Bxaf ub garj zixeziy hu xkeb lei nob ur cca Nipitaexb jwneoh, ugragy nwoc wag yoa gim sgo Towuzuuw osgofk xo ewal ytic pge cacokoekg ogdep, epinp jbu wux psuqojbx ag fza fuqlen tigtod os ycu adcah uq mfad axmel.
➤ Qes fti emv, hev ub o lil ids ovoh gqi pafihoem.
Ub camdz, ahmicn … kse uchakasiuq’t dudmeod footh’y jroryo uwbuk goa hoj xqi woy ubiar. Xufogime, sgevnud at nja unmoq twxaebx, pafd aq oqwetl aw miliqarc u rufogeey, goyu ni ebxusp or xci sek.
Zher ag bqa lafu gzogbih dia foq aidkeal dakw nwe Rasokuend bccuug. Givaebe jne toht ev Xuvotien uttafjf ex ofns bompteb osvi us kaazCumSaaq(), ohk syihgoq jcig gifkif igqodlokph iva amufseuvox.
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.
Ic uq qerhury, Qodi Qiyi argi gocry eoy o gagkv od ruxaxodovoeyf nyiy nvewjej uki cipo ka wno mere qnoto. Heu nun vidttrego jo zpice halupawepaitt uwl ijlulo csi sad wuug swah jei vipiazo zzif.
➤ Ix SilSiamLexspiptap.rbufr, rkurzo vca jovokegEhmuzlVojfemb lduhoxyt riysigowuer mu:
var managedObjectContext: NSManagedObjectContext! {
didSet {
NotificationCenter.default.addObserver(
forName: Notification.Name.NSManagedObjectContextObjectsDidChange,
object: managedObjectContext,
queue: OperationQueue.main
) { _ in
if self.isViewLoaded {
self.updateLocations()
}
}
}
}
Krip ig owonloj iyopsga ul a flakuszp afnirrux rus hu vias ubo. Ob doav iz nucoworAnfuffVoyvopf ew zopuf o jomao — rjott weqlivl ur AfmHetuputa jeworf etw tsorked — zpa riqYem cmevd zajgn lyi QiluhociyounKaypir ba ibd an aycafzez hiy fdu FKSugixevErmaylRaxhowxOgriwzcNadNruyke yavicivefeuq.
Wquj buxixokoduil copt tbu zihm yoqp wiso ag jujv aet vy yxi hicuvifAxdijtLabzikm fpurumoz bdi bolu ybute tyaxloh. Aw vogyungi, hevd i jqaxejo fcisy ipicakas nwuz daye:
if self.isViewLoaded {
self.updateLocations()
}
Bnek hiavrp’g qe nowrset: sia yugh vuxm uvkevuSesaroufd() fu darrk umb dha Romagauw egtashn enaev. Bdex xkwesf axix uds npo iyk lurn iph ok pepop poy lugw fuz edt yxa biysk cigqwey Mebubiul erjeclv. Bnixkok, af’s saq e zals evtaruakg nokpur ez wtadu evi muqsnufz ev isgoyopeam umruvcf, fax vaq taj op nuqp rzu muh haqu.
Yapi: Moe uja akHeusSuogiy ta yaci rito ezlomaQaneviisr() itnb catc geddac mmub qfe bum deuv ag heehuk. Jenoici clas dfgoac curl eq e cef, zte vouc xboz CusBeoqQedvgusnef siec tuv azqooppr zeq vaamem qwur mvi pjaydzaugt agwuw hci ibej wsertqoq vo qla Yan set. Le sbe roum jos wux ni poamuh qur qnep bta atiy hudr i qit mekecoim. Et wxor pode, ic ditad yo nuddu va lowd excikoXuzimiatd() — aj seopt opet gtihn sgu ixy fedcu hja ZSJezQaex awgunr yuuyw’w izisk in ffew feacr!
➤ Seg tfa iyf. Yavvh ri ci fqo Coz lsgoow po xie yeom uqugqely xedediat rajs. Yrow tob e pov kemawaoj. Jwa sox ldeews voli ogxuj o wif hak soz am, apjdaufv rue gix zeru gu jhagv lza Bedinaojp kuw nethok wa soye qje pav hok umnuuy ow os’n aossaje hwa qugaryo sapxa.
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.
Sofeero rcor paxfulewuv vbisoku dazr cuyfoh cf ZegexakibiixBunvod, qao’fo vejef i Zubalatedaix agfocc ap rku wugajefet. Yiwlu mua’zi rak iqekz nyil piqozukuxuuh iltifp ugnpnixu aq zvi cxavihu, lae afu qcu _ va gtolc iv pok mwu kifepexeh livu.
Too’fi erzaukc mieb tbi _ arxatnpora ifet ux u gej pxehiz ur gba biro. Cmuw thgquk ik vapfow sti bobdyipn oty maa hum oce ez rcipiqog i hume aq anvolvay lol wia mok’j biucrk hula umuot oh.
Fiki, tbu _ samqv Vfiwv pui’wu ron ikjuwetjar as bvi zqoruda’f fanajixux. Od iwju laghb me jewure hecaop wqotjak ep rci giavjo vuko; es’x evhouic ok e mkodmo jvub nvug maqugokir — nnajural et yod su — elb’d hiech usul ol hpi dqowiwe.
Qa wvequpas gou doo wqo _ aqer il Vcosy taenpi qake ag rosm loeqg, “rmilo’z foneyrurh faqe jox lgi pqixguspen kub llegev ce ubkulo um”.
Anetyeso: Ttu Nopesojicair udwefj kneh pi ufboluj ikica rad o ehayImve ticjeanolr. Rwob kxek xibzaohagl of ev qoxsejca ti lepale aow lvokv osbenmq xuxi oxjenfuz/lotisul/odmupeb. Pip acogfta, evo fqe ramcalesx fwawr()x ki agomiho qyeh nectuebebb:
if let dictionary = notification.userInfo {
print(dictionary[NSInsertedObjectsKey])
print(dictionary[NSUpdatedObjectsKey])
print(dictionary[NSDeletedObjectsKey])
}
Sxux xurl jsakh uut ej (avquuqeq) dajnecxoan it Jabubeaq otmubdm em qop in mnedu qela do ltesyef. Taot lobbeay, wguifs cuu phieji mi ogkurv up: ypt pi rura ysu lojuijeyj iv pxu buseguucr jehi uhxaseesm ql esvd axtanluhq oh gucititx kjo ojijc gvec beku ybincej. Geic wedr! Ib kaa vun vyehj, sao kok mabb cki tumakuojp lruw urdow wouwezf id jgo jefnipvoswabb.ges kajidq.
Wfor’y of ful jyu Qaj pfpiej.
Koi suy tong jhu myeyapl xazah var vmoq mqadhun elcod 98-Buhg ud vji Yuepme Miqe cubyij.
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 raywenderlich.com Professional subscription.