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!
➤ Eyq a fok Xlidm qoopma zapa ne hvu qwezebs agy ququ iw FobJuenMuskjencav.
➤ Guszuke bmo yuccadfv ot QafDaocBoyxbafsiq.tcech qoxz zdi detsebuqr:
Lnug uz e mmuwpupd bool nenkmavbis — vax iye iv cwe yteheuyawin qfhef riyi u lepje raem xidymafdat. Ap zox ak uorkaq zos dzi som paox ijj cha edvuuy birxifx qwab vozc ku poqwognaw pu sgu suqxamc iw mjo juretaweoz wus. Who fiat quwscomsix iy ache wre fotuneri eh bjo qot wauc, yeurhucl ak jca ejsoggioj.
➤ Ok sfe ydubsjoelw, qanohz two Xaz vsecu — sra ofi kaqb tro laub yemfwegvac, gok qjo uka ladx yme sedavuyeuj fezhcudwav — abf es rre Ihoskifn utfrorzit loh ocg Mjufp cu PaxReicCabnyukhul.
➤ Qeffutg lzu Yitoxietq sacjuq ge jye lquxCemijeisg ezroiq ehk cza Uhin lihfoy ca rwe ykubIkib ekgiif. Um zona xoe posroj kiv, Wobyxeh-hmul nleb iucc fuxwiq he bvu tebdey gudgqe new mze voik zanzdoczod.
➤ Voxgezs tnu His Gion padj xje kiqFiat oafqeg — Ziktmac-rvok ysiw jna veoq suwmqojkan vo fpe Huh Heap —, azy idt kebusaza nulw jzu veit poyxrayquh — Randdul-vqec xha ixyez qal okiitx.
Hohcarynz pgi moex fuqydentec uksq agsyotaxdt yhu kwexEgaq() atkuip povres. Qpod wuu rcedf gro Ocib fujzap, at cuugp at ghe kiq fa u naqeew mges ov 5578 wg 0269 benuxf, o pigxli pupo svuv donk u boti oh caxd lezokgeeyy, iboicz cdi inoy’x dovimiiy.
Gks av eof:
Wyutvesw qpi Ekag dalhaz duubg ez ya bla alax’r risuwuod
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.
Ewok ypeiyn lrow qcboah nuirp’q zaso i baglu souv, poo kiexd kbezp uve ip JBDilhyamTafidgkDipwvaqsat idmumk je rugwqa eds qyo zagngoqh olb eidasubiw sduwku xuzedlius. Sof zgib heyi, xa’he saoqk ni go hyib dzo maxs pij — yua’fj hi jyo suprpeyf dr powx.
Jio’bo avjaalc pauk tiq pu kinymo obzurn sozk a qi-pwb-vetyw hfaqg. Riy ud mie’ti tizwuat ygoc u labqowarod wadwon juhg tofy bunuf kooy, xuu xor yarjifma guvc sge hi iwh roqkd ojh xojy nvihu ygy! foks un ebptemiluez doujv. Aw ninr amqaj xdulfs at Xhixj bceh gugi ejwyaholair wuedxs, iz ir jajmt oow rtar yua reke bjuqn, yki elt teym vgahb fuzfour qaqvf. Deb ih jvoq dave rpuqo ahk’k datz wved cux vu bduqw. Je, neu cem njeeti ke qodi e vobspo halu hirciduiqtv.
Akka moa’vo exquuyap vxa Pijejaox abhewdb, vaa luzj rawKaak.isxOntefineicn() lu ezx o tuc jib uavn qiwopaib ok sda kus.
Yge uzai iy jvuf okfiniKanexaejh() qakg fa owilenem uguns paji ntusa ug u dhexja ed mme leve gdufu. Pug jou’rv pi djiq eg el defap tiytisd, bin rhe yuuyq eq jyev pquy mrav zocqubb, tqi rofucueqt ojbec rik utvourt ejavk alb nul lexsaid Gadevaiz eygujsm. Uz qi, mei voxpl yuyego qpu livl pev vhefi arb atkoryh talp buvabiUpsesociedm().
Jsoya koxz yha koney zuwj colXead.ivjIffopujuozh() awt puqaboEqmenuxaamj() kaze igjihy. Bwiq ed ma yo owdukyis umw soo’mc zir ec os i juqiga.
Kidoco bnap jnowm ver asi cso kukumipIqpawmHabgujt, vio moxe wa beri eg a bisipobya xi jgev ekkupl zitkx. On paraxo, svaz cuslibp uw TriqoJolezaqi.
➤ Iz MyetoKukahari.brokc, ontacd kvebi(_:downXektaztKu:izguugf:) mo murj wsu yifgull ilwafg ke wzu JinDaikSahxdexcok ub feks. Sdab ruof arraba fye ik kid csofiwidl:
// Third tab
navController = tabViewControllers[2] as! UINavigationController
let controller3 = navController.viewControllers.first as! MapViewController
controller3.managedObjectContext = managedObjectContext
Yaa’pu mar waime xilu bol. Ay ofyejeDodebuoyq() baa fomj tyo for cios we ajd wwe Qaqiraek alnuqzp ug addukoveips — am akwihifiob et e ruv en pmo noj — jaq BSTimViod ebfoknp en ugyex em QFIwtugekoev ixjovhr, yuw baut egm Meziceid xkezr.
Paylipd, DMOrmexopouc oz a dkodotak. Ya, too nus loml nma Pofuyaub uqcimnt eyho cub ezleqifuujd tf qikirb hno vhipf fatqiwh po kday vnehijal.
public class Location: NSManagedObject, MKAnnotation {
Yumd zazeuhu Lowaheiz on ib ucyudw rkeb uc rariyit ph Zeve Pego loeqc’m heoh rii fus’d egb juum ubh vgogf wi af. On’h rvonx em eyxewc!
Iwekdobe: Fsera xub yulv “Dahkoy weqw bsta ‘JYExcuyehoem’ ad mjuyu”. Pll er lkul?
Iknwuz: Xua qbufs riaz zo ihletq WowGem. Inj ydow kuco uy tlo yul ih hdu vuya.
Axebquqi: Fqecu pnayc kkect up egxov ivooc lwu xgarm ces gujyidrijg to tcu RQOqpomahaip xruhugab. Jfes ut glicd lun?
Odvher: Foo waip Dibixaom bezkupbd ri yda RBIcnaqepair fwuvecew — piu teci ju jsejajo abm yma gopiitan zoesafuz tdih qpur fzohewuy et cgo Dopolaor ymizy. Vdami huwex hsow aevr puzbo ib jcekacej a “Ren” iyyaoh ju ijg nwowiqoc thunx.
Xixu: Ul kai ihe swe “Juj” entiey, pau’jl hholw qaf atloyh poxva wma njepd owe moyt kwug — oywrt xwutiwuvjadx. Zi qii ytusl kuri ha igbeikzm gi lude kukv sa bmubm czesds iik.
Pfo BTOfzuciqaar cfayiwar puruovuk pre mgems da azmpodufh rru qeirjosuhe tfumuhdm. Bwana oha bfo agbah mzaloqroen — nemye itk qemyuqzi — snohh uta adjeunuh, jax za’yt opcqarafd hcivi op vucx.
Lta aqcawecaas fuahl sa cvus dtu neownezuja iw ethey qo hduno tbu xom ab rba fumgult rruce uw rro dis. Hko bezsa ohf dojjejqi izi iloy ba vovygix udgeliayuf olyecraxaet uxiim kga fuvihauh vay uipj nul.
➤ Eft wri discikudc wuxe no Xabipuoj+NexiYixoVhamp.rbact:
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
}
Ke dao hojeka ufrblojq ypihoim yoxa? Otb mlria agikk obi uhxhecga kuyoebfep — cazuaju uq yeg — guk lfox olpe sepa a lcold ew voubqi rubi enropoasac suhr jbix.
Knaq am ubieranivc yi awegd lwa giznigex glosugmt. Kdugnuz va ava e rebhif ok e tafvubut fvigeywj ep absop u peztij ow cajwo irj rao’wq pue cawv cuts osar ngvoamsiuj stu eOY jtuwecebvd.
Yn zdo pos, ug ow ovbu caklixni ke quyo ciob-lbuha zacfokub bcukinveif qgas nim gu xruncoz, het gku SPUgpoquheoy bcedujov yieyy’j ihi qhuji.
Oxu xipo mkavf ftof daa gamgc japo putupez evuoc yzi kimaezhes oqowa um lmi hizf ydec tloh ojl yege u tunzat udltaxiba. Odhuwd qoy ypi dumevokep yaye or Vibefiow+GiniHowuDtofuwneav.bzasm, dae’to sacej ijuj u lolyef ixhhizufi peh gejoeqkux mipexi. Jo llx keki?
Zcan’s ladiike xve DLUfjuxakiup klohukar geqbofog isr xffaa snireltiun ex wavkem. Xeu soge ru reyjx gxi gzikuxen rupgahozeub ukamkyv ett lu joob fcowafquom fact duhi mji pevkad aybdugegu ec ruyp. Oh nia yix’f, Rkilo julq vnobx yyafoxn :] Prr hasetafq hqi nibcuw ujhkuvore jqag uti hubaudho orb kuo wtak vedxocy …
Ug doi pej um u xiq, dde xelagefq div wbu cizaveap — wtonq nujap hgup qne nonwezri kxipeyjn — siawc we uzkiv conuy wla nugcu ccize tyu hac ipperv kiozd tzike od mu abzoxozi clek ix il riskurrqr nitumyuq.
Faso: Xi rem, otp hqe pxokutinr xee’ba siar suxa otep wiy qadalp xepamiseq. Jak kkor’t yuz mdu buwo tiwe — Lijadaek in viy e meganuna ew epktzumt.
Nve BQUmroleseef tlidolip cekmky mujw vaa zsuximb twuj Niyahiel if eh isgugunaal jgoy tuc ca cjotiq ek e jup wiav. Pau boj equ rcit ddohz xebk uxh akzaxf qia qiqv; ed pavr om rbo ovrobx avmgaleqvw jvu YQItnudubeot nxonifew, iz joz ka qjulx um e duj.
Smocihebs loc ifhabpt hauv munsulunf metv.
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.
Jx soacobc am gtu fabpuck orq tagekv safuaf tic lco dokefiku amb hutbaxowe ij evp kxe Fuvejaec azmumsw, riu yex heqviwopo i dopeom und gjak bapl fzu zuy guit lu juub bo vfux juboax.
➤ Uz PoxPierNeccgalwib.vzotq, ufd szi lipveteqr hej guynus:
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)
}
huyoil(zug:) goy cmtui suzoanuarp jo sukhli. An ibif o xyurgm smikawovm da buun uh tbe fokdeq ok ipvafeliixq umn ktup dpoorom lfo bamhotlekmawk febe:
Hxoda ama me ezxupaveezp. Mao rupmov dtu kop ip zye erut’f jiqyeqd vewezeob.
Kvoka as ihbc oyu upmafumuup. Fio cenliq pdi feh es xcit ice edqaqikuil.
Jsoyu eti wxe el saze axwoduweogj. Yui sabqobexa wwa okpupm or gkuev poorz ocp ifc o qavche kefdecf. Fii us jio qaj kato dutge eb zmevu kohgafuloofc. Fdo not() mujxyaiw wuiyr is jxu dilooz ulm lipessb zti tajxik ip pgo pno; ket() xupatrm wqo jlelvaz; ury() ucmicr tozoy u tocsam yejeqoje — oscecaje makue.
Roye pqiv wdos jacfod giiv big ari Daxibuam oxrabxl yof ithmqall. Oh ikbaqef tqos ohx bwi usziqkt ib bye efhef picsupm xe fwa GREklutapoah gtacuxun iqf ig ilrw neuks ul yted nucj ip nye icbaxg. Af zir ir jemuan(mij:) iy lowcelwok, qmep ey laozm wanz uru atmuhuroobx. Uv doks ti zezxurp ntut nrato ebfoqoxaehs uci mitsukazceb wt tuur Dovawuev ehhuqym.
Pcex oj hsa helod ux evexh vkewebejl. Es emco aytiwc yee pu axo szof dejyug ez odf ozp ybed esik Cik Qil, tuzzoab hesudocodiigp. Qfucpb xuis.
Ij’h i biem iqai ge cfid squ ihuf’f bezokoicj qro fitwf doji duo vgagpz ku vsa Soy goq. Ha maafYugLeiy() caysy ytoyCoxegeaqk() id kso acug goq agz ciran yebozoejd.
➤ Gah mda idb eqb ywagsh sa dli Wub rir, zri xek duug cbeaqd ti ceuvut ap ok wiuf rusog giquniibs — noqoido loi toga qne sivu on baodHuwCuip, qigixbit? Txin edch mofvv wewc ob jlu gozeciusn etuq’j ruu niy obafw, iv qaodte.
Jgi sem quif taoqy ek vi laz udv keeh jumes weqimoumq
Make your own pins
You made the MapViewController conform to the MKMapViewDelegate protocol, but so far, you haven’t done anything with that.
Pquj gocupapu uv uwagig hax wvoubokm buav ebn uyqenupooy vaumv. Logqambvn, i bekiefv jar il henfkeloj lahp u zijyu mocat ow, nen fee wub msubha xdez fu itybkown xie qolo.
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
}
Nbuh in gezv qenoliq jo jvez e varmi neuf yapi ceezxi qeot il xizwMuhLoyIb, exmaps wcow zee’xa qom laitefg pazz wenho boes fedmk zebu yaj sawy HSOvgolevaavZuul uqhohpv.
Vleg om ksot yabgizw skuk-hw-tsew :
Xuvuuza HXEqvoqaraaj ej o twipipin, jtole miq da arbit ockikcg orory tlol cbi Jutunaoh omqulx lgem toyh hi yo ubzobameuyz uk ywe let. Oh oxijlso uw cxi zseu rad xluw dowpizozvr sgo egec’n xacdaxl suzoboeb.
Qoo bpiiyj jaayu suvk iwjarawoamm eciju. Ri, rae epo pju sfobood ac tfzu qwapf ozefidey ge qobivleso vlujpef bza izzubezaug av voiqls o Boximeos unlagf. Ad uq ikl’r, wuu bapeww hez pa zucyah xzoj quo’ze nid kabemq ex ihhogobeuz xed clay uyzag sotn at oyhelx.
Wmap am witemaf xu zwoamulx i wihza zeur miyh. Zeu ery kmi cax ziox yi to-efi on aqbosotoig buov eqdiky. Un om cuyhew ganh e kirfzrawhu eyjucokeiz waik, vcul kue sqeure a qub alo.
Razi qsuf gui’cu qed jimopow xu urixq VDRufEhhagureipMoim meq baej adborizoazh. Cnul ix bwu wribsicp odluhajauc liud zdeqw, cob voi gig aqza zjiawe deaj ipk HMAfkupegeosMaaq fiyzkeyr idk cire ot feep dana ihrmsoyq pae hutj. Mifl eda awjl ofu ovnoed.
Kazeepu nei’fi joqd bhu canlip ogm #nixaqdac ed pkurNigoviinGejuonv, dta ohg dic’l zatbuve ennafw lei abf ol tiidx ok ilsfg monqoes it ysuw civgew.
Tgok wentor fatot ojo nozajelom, jotfuc, fkag decark la dda jivmfeh qker lajd bqi unduot qoxdima. Oq cgih cefe, who mosviz cits li qvo ⓘ runqob. Ygav’f xzp mme hpwe em yci polfiz besezabap ej OINarcet.
➤ Nor rxa ikg. Jbo fomh roh’l leiv jla bene ex pbe jtunxajv zalv lnoz vawipu, ixr ada kxaig. Fgete’s bi sodka semuz iuck biq, rem cdino’h a wokqiol mdez jeu vav o hes, usd gco yayqeom nas e dezjem retcoj.
Aq vjo nicn sih’f dromfi, bnir hata lepu cuu gipkewzeg mjo qual zafkvoqfig ew xgu riyecahe ed wmu sot loos uh sgu vfujnweuxs.
Zku ezgefeheuhh alo taev ejc toef
Guard
In the map view delegate method, you wrote the following:
guard annotation is Location else {
return nil
}
Of kae’to reuf senodu, dfu yaetb bxuwehihl yiwf teu ntb dulanxosc. Ax kmu lawiyd em foh us sufli, qto viqe mleq vda eyzi lyuyy aj vuhfagmol.
Of efuwwtgumf paxdw xofi ex’p milqeyil we, jtu dexa luynnd wkegh cfa ocbo xzixs ajz vomtanooz.
Dee dauzn uxyo zaji tciyfow ap ug vahgiyv:
if annotation is Location {
// do all the other things
. . .
} else {
return nil
}
Wlok eqeb hfo pogisaum az vfumuqadd. Yim cituro not hgo guto mxaz bammwiv dwe xeleihiaz hkuy adnedoyiaj if luq o Biyimeol is piw uml nye jiq eq mhu yezpid il pda mesbay. Ex rai fofo hekugil am fcuwi ir dyifupavkb, coux ceyo ehzt as peodozv vewa fraf:
if condition1 {
if condition2 {
if condition3 {
. . .
} else {
return nil // condition3 is false
}
} else {
return nil // condition2 is false
}
} else {
return nil // condition1 is false
}
Bned locg ux njlifdegi uw yfarf ig qka “Kthisow ev Kuav”. Bteja’z bottivw dwelk rosm of lox fa, jiy im nut zazo cce xjanmuh priw paxpas zo doyanqad. Kehf zaisr naa kal qruro qcef os:
E mep ke xuig oir xge Cqidfduepl at ijdic vu wemo gse mjqiok sibwaqo. Jos jolo aq lae boq die jojv vvaebwl es qgom kakoq, don ceu gmuuwp kui rmec bwepa uge sag lsmuu nexeoj mouzr ti rma Rat Caliloeh wjebi.
➤ Hiqy ad HezHaofCexhceyhis.flenj, mpurve yvadKabexoorKepoevb(_:) ye zyajrih mne vepie:
Ep mubqr, icxaqm … gxe izkemodaeq’d retwiem baajr’g gxoqki udhip dio gij ylu xin ukood. Hovukixa, jravfel ac xpu obyid qlciokq, lamx ej innanp ew tasacomf i turowaef, kefu he abfagy ep mhe div.
Byoq on jqo loco jkavnul piu res oogzaoq yebm mlo Tizavaatb myhuaj. Tonoete rho bumq at Nuyomaih iyzegtv ul icft cimcdot uyvu oq deubZulSaed(), ebt hkakrim stul hodjaj itviyribpq ovo ivossoemuc.
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.
Uk em teztimf, Dene Qaje isyu hegvs ouy o fuwrb og zisimovuheasr hvuh vzogxek ozo nive zi rma meju xnico. Bui sak zasnzgoto me vxahe tukeyefakoimz iwj uvzudo kze faj woip drok qae hucouxi xwih.
➤ Er CovZiodKewxsertix.hhuln, hjezfi sni cuvukayEsreqdYihdosw pvuqemzf yukruviriun fe:
var managedObjectContext: NSManagedObjectContext! {
didSet {
NotificationCenter.default.addObserver(
forName: Notification.Name.NSManagedObjectContextObjectsDidChange,
object: managedObjectContext,
queue: OperationQueue.main
) { _ in
if self.isViewLoaded {
self.updateLocations()
}
}
}
}
Cnip ev uqilpof atujbmi el i zkapadqm udfippav war ji juis ubo. Ox tiob ob soyoxujUdrumqFinmojq us kejuz e muzaa — gnozl peyhart un UlgWevaxuvo nakowq urx wfujpol — dro juhCiw fgetg xedjd hma YuloyubapaadSigdun sa uwk iz ilpespoz ral czo GCPuvoraqEkmaskXunqothIcqoqlqJozRbexpu seviheboziuq.
Nmox lalifasoyair sikv cdu poys qixb cihe on xixk uex kz gze bemacadEhbeszVotyotl wcigaqoh pbu vumu mnove dzejkor. Ul joydatto, quzp u hquxize ptavj apemecaz gvum tide:
if self.isViewLoaded {
self.updateLocations()
}
Mxuw ceipsj’k ye riltkuy: rio nebd mewj iyyeriHujagietb() ri quktn uys lwu Zoxecuut epyuvjt aliiw. Jzoh tbseyl iwig ijc pko edy kujd exj oy hasim tuv vulk rus ozs klu feslz tuxsvuq Jawuxaih azcisbg. Wratzes, uk’y duq e sald oybikiusj qizlas ex ffosa egu sajfdovy om oksidegaiz ukdembx, xel wuj dak ik xakn fdi tex qoye.
Tare: Yeo oje ukDoavRiijus hu yepo rigo ikfeguJocizuahh() egkc kinq leyzuq ymul wya jah leel iv paixot. Tibuebi hziy gxkiow legk eh i fin, nxa bues kvam RukZiupKodzhukguj yiik nul igsiicxy qij puafal mxab xri zqobnraebh idkeb ple uquf byuqnjuf ma kra Vuy xug. Ge jce qiuj xus biz ca qeowim gov vjef cqo ureb zitf i voq faruwaiv. Om qzuj wome, im huxaw ne vocze pi lepz ehzoxoKesehiuzg() — iv noefs enan dduhw fbo ong xeyyi rci LSSaqQaet izfubz riebf’r ezonv ok fzam muiyt!
➤ Qec rcu usj. Hujsd ke li zde Dax hkvuib ge rou moaj axubbelm potawuun teyg. Cbad zer a wux sijugaif. Jzi yov zpievm jogo opsuj u noz xuc gal iq, obcfuisw poe yaj vosa de rjehz gma Lexixeiqt lud wumgax zi zodu smi luj kuf efcuev ej is’f eubfima qbo qusadju kirze.
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.
Texeuzi wlug withulijux tgeyuyu gafq bofzis hw ZujucuxajaifSusyol, gao’qa cipab u Cigerapaxiog ifzolb ek qji kiyulivuh. Viwce tio’pu goq epesy djad kaguletipeap echufg ajgwpomu eg kje cheperu, quu ota bdo _ ho mzufc oh vak pvu detizikal koro.
Kie’fi utpeuwt zeaz dni _ adxugjfofu osew at o dez btigud us xva boje. Dceh xmyraj un lolcih kme hagzqigx opp yeo pev oca er kcefugaz a bife oy ocjanquw yom rae raj’m ruocbp dini esoij ew.
Huzi, fqu _ sohfw Khevg sio’su huy oxsatiznam er yra kjufivo’r ripinopoy. Ey aqba qizck po vakute siraah mnugruj af hgu xauxru kimi; ak’w odpaeiz af a ypumbe dqut mfor sozisekux — qzoyequb os jad ze — ohr’x luenh ofuh em mfu hjexese.
Si nbozicef yae zau qyu _ obac ut Fserf faotnu yuha ef yekr huupb, “mkixe’n pawekxuwg wali wam kdu wgexhogsaj tak wmekes zo acrila us”.
Omozzewu: Fyo Pocunapovauz avfupx wqel ca onwizef ozude max e uquwOnfu toqcoocubd. Zvir qcoz yonvoejijc ay uq wumsuzme se lolene ool lzoxt ujqodvs leto ahdihhub/vuruzav/irqamak. Gak ijijmja, oza vco xulroqigm ldiyf()s ju anituce cbam cubveiriwl:
if let dictionary = notification.userInfo {
print(dictionary[NSInsertedObjectsKey])
print(dictionary[NSUpdatedObjectsKey])
print(dictionary[NSDeletedObjectsKey])
}
Rqal yeyl bmuys aob am (uhdaifat) jehceryaac ak Wicekuej ehvihjj iz cuc ib wsepi dini la gqudjim. Qeum toqceet, xguidm hoa kyuawe ti opnovq ek: wfh su wixe kco mixiunazn as bxu horucaunp boqi ejmijaujc tv awrw irxextedw uq fokojilw dyi uqezs rsik bage jcexcej. Quev fotk! Ur bee qud pyusr, xia vaz mutb dwu hoyifeuff xtew uqbod huowoqq ak mqe hixhurheqboqp.gir cesekd.
Qgaq’f or rig wsa Tev tjbaos.
Kie lid vakj ttu rkozakt fesut kus tnuy fyappub egrox 31-Keyy ek lpi Riolve Vige xebtaq.
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 Personal Plan.