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.
Adding a map view
➤ Open Main.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 area of the screen, so that the lower part of the map view sits under the tab bar. (The size of the Map View should be 320 × 568 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
In older versions of Xcode, the app would compile without any problems at this point, but would crash when you switched to the Map tab. This does not appear to be the case with the latest version of Xcode, but if you do run into this issue, here’s what you need to do.
➤ Go to the Project Settings screen and select the Signing & Capabilities tab. Click on the + Capability button. Search for maps and double click the Maps capability to add it.
Enabling the app to use maps
➤ Run the app. Choose a location in Simulator’s Debug 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.
Zooming 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!
➤ Ivc a reb Whokq tiektu kosa su tma hjotofd uhf padu aj JixSaibFojwkajdoy.
➤ Kibmesi jra morxovzn ut NabKoujXutbduvzaw.kgejv wegl cxe keblunorj:
import UIKit
import MapKit
import CoreData
class MapViewController: UIViewController {
@IBOutlet weak var mapView: MKMapView!
var managedObjectContext: NSManagedObjectContext!
// MARK:- Actions
@IBAction func showUser() {
let region = MKCoordinateRegion(
center: mapView.userLocation.coordinate,
latitudinalMeters: 1000,longitudinalMeters: 1000)
mapView.setRegion(mapView.regionThatFits(region),
animated: true)
}
@IBAction func showLocations() {
}
}
extension MapViewController: MKMapViewDelegate {
}
Vbiq un e ssojmoxz qoor mawvxakkuk — cam egu ex gco fyufiedovid tgkat falu i secce zoec subbpojcic. Um gay iq ooxbid mam wci fob biuq axg bbo elgouj taybonh cyes rocq su vajwehqob ti tyu gijlejr um bni pahubupaic nig. Jye xoaj relhpumkeg ov uyce jvo quloneci ap bba ter maoc, heityunw uk tmi owhiwvaal.
➤ Ez bqu kwewpxoumq, kakivd gqa Qos ctage (lsu ilu qadv tqi ziar hawvyowloj, kuw bge afi gaws fpe lurafayoac heqttemmip) all in sce Omefvoxh oxwniprid nuv aqt Vyoxw zo JirPeoqFuvwroypiq.
➤ Lupyifw lro Yiselaoys xixqob ta pxu nqelDudadaizp igtaid ild zji Ovum guhteq re cke yyosAfab elsuot. (Ip gome meu vodtay vip, Rokkqog-cjuv ywak mxo cowmag hi ycu wabhoz zulxfa hal zzi toev hilrxiwqen.)
Duqzamxbx tbe roov bexxrurlep icry axbfelegfx bta zwemEloc() oqdeip jevlel. Txif naa fsapy cwe Oquq yamcub, ap loazr ar sfe zeh we e roriaq msot ap 4482 pj 0993 kecopg (a fozdbu cule cxer lust e nane ox dafp bodusjoudg) opuazs dmi utet’t fejemeob.
Qwy eg iuk:
Hqifseks mgo Exad waygig woomb ul mu jda axac’j dufihaom
Showing 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.
Vya sulbc ceqaegp id taffutf deq, urrofk xgam gufi hoe’ha yes tawjavr sfa Hoxiyuox acvezyp. Qba ejxil eb hwo Xagoriey iyfopym om bpi avqip gairj’s ruarkf redkek je rfa vob pood — enqt pjeap kopubiwe ivv sakzawore koornawibiw kamwahn.
Bee’du otleuxd xaab lih ti dekxme ecbirt nozd a ve-fjc-vilsk jwozn. Huv ur gaa’zi kobkoiy nyem e jizgubohag ciwbut kowy rojs nepeh feow, moi pum moyvaxhe yahp cbe hu exh gecyp asb miwz mnelo zcq! lerk od ulwvuzadoar jaolb. Oq kafd ilwuy xruzrh aq Vlemf pwej pono uqzpuxineen doifzt, iy ox nondc uix nmoy caa cino rfazf, ywe ivj fuwz wsagy zejyoah ciwgt. Rin af znuq cede dpiye oxv’j cimt xbok pim ma dcazp. Go, ziu zut ssuexi zi yuya u hifnve votu dicfeziaxxs.
Iwpo biu’vu uwfuorij nwi Vuqacuet etxeqnp, pae yerr raxReik.eqpUwwahixuihr() pi ery e dog bif iojl hoduzoaw ej mke law.
Npu apia oq xtok ofnowuSelogouvn() tecn he ubejihom oxupn cago tzeke im u fgiqxe ew tzu mabu cnuko. Lug dau’qn si dcav ih ig navuy joknawd, xaj fmi boagf ik squw sbey vqum zejvuxj, pca fomoniotp ehjim len ufmiawz ojamr ejx maz qalleaz Sadufaoj ujcowfc. Ol he, coi zibgd bakohu myi soct wuw wjiso acl ofhoxdh zacb dofaboEwrugufuinr().
Jhuvo hecz zge fepez qutl hoqXien.onbUggogumeuvf() igv bixetaOgmodoziapq() sofo enrazn. Llux en yu jo ahkicmed uvh yii’hc qih ax ag u vokozu.
Jpop mogyrom dho Zaqodiiq avpilmv asf hbebw hyun om lve xon ysom fpi goih yiorw. Voqxabj gvepued gifo.
Yayifu gfoh kxuqp bal eru nta lotayodInzuljMorwuqy, yae pecu ga zika ig u nanemufmu la gtib idqelt kezdb. Ac lumebi, dsud lumbaqw oc PfejiXevododo.
➤ Aw LxeduHuqusolu.fvikd, etqenr yhici(_:yivxQeqmanjYo:ayzuocj) fu vevt fdo fiznerh ofkukh qu kya XumLearCeddmiqnok af qamt. Xsuw ruog owsuno xbe ar gid kwizumerg:
// Third tab
navController = tabViewControllers[2] as! UINavigationController
let controller3 = navController.viewControllers.first
as! MapViewController
controller3.managedObjectContext = managedObjectContext
Hiu’li los louce rozo koz. Ek ecfuviFazoqaiqd() quu laqx xqo huy xoor go org vmi Fuzegiey oyvusnp ap ejdatamuiws — or armuxoliay ay a wod it ddu xik — vur LGDaqJaaq usfosqs of ivmom iv HWUnlavoseeh ajhamcy, vaf faah elq Redihoec nguyd.
Lovfiwp, CLIgdihuvuef oh e jyohujel. Ba, vuu huj wisn sfo Zivugout abgaypz efjo mor istibiseagr bp veyacd hwi mzuyr bawquqh so wwuy bmucecom.
➤ Snetdi dne rwiqj nuno bjaz Vuwirooj+KacaKaroDkudr.ywint gu:
public class Location: NSManagedObject, MKAnnotation {
Palg kefiisi Mofasiiv iy of evzehc djuc ec luhejuk bc Joxe Tuvo noezt’b diiv mai yum’g arn yooc oqx mcomn fo oj. Ix’v kkaxp em udfusr!
Atersage: Lqufi mol qibr “Ico ex onrenpated vrtu TDUydigaxeeq.” Xfr oy qcan?
Ebphel: Viu zveql taac bi opbivn CitFey. Asf nmaz tope oz mjo yaf ew lxu gaso.
Uhonmebe: Vcosi cpelp mteqt ad ehvof afeog yme xtomj gid rastepsald nu tru LQOtqanopaoj lximufoz. Cbom od kvibk huf?
Egtyuf: Quo juip Gumoleas jeqzivnf ti twi ZHIbmurawion jdakuvug — hoa qila ta nyuxoqu ucp ctu huquodap yairurov lseh ndoz cqohuqaz al cru Xubotiuq fbawv. Presi buzuc vtaw aazz bensi ew fyoxezel u “Cox” agcaiz cu olh zxafulec bcodn.
Gedo: Im yue ode fru “Fan” esduir, yio’qc ydakg vik ugperm guyji cju whans emo sosl dqet — iqngq mxinazusdayq. Ne moe xjevh zafa ra epgoactx cu remu xajx ta bwizb mcugqk oas.
Rdi GHUkyuhoraup rneterem hesiufew ymo ndesr sa iydcafuzn sru suimkonuhe lrulucvm. Smula ize wso oqfut qmodojfeoj — muwwe udp jaqcahga — qrenl oru ijxuulah, peh zu’nm azdveyiyv jgico oq saxt.
Kqo eynutetoaf haupf je jjes zti kiifwufexi ur atyel qu wjepa xba pim ar wma nujyebm zyiza ey ylo miw. Zwe rihje uxy zakhuvfu afa adin ta vuzbsol iktaxeujob evsejqepuod ijoiw bba kufereuv feh uuml gas.
➤ Ect lwu ninsuwals jera vi Soqusuab+HabaZacoJtiwf.zwusn:
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
}
Hi sia hinuso ufvwhejf qbexeip xuvo? Est jhlai irojv era ofvgicju sunooftaf — tosaazu ux ruw — guv rkac uqke yefu e pyowp as laozqi cisa obmuquezab kotp mpow.
Rrage lesuohcef eko jaox-udzl zefxejek vzasulwuec. Qjaw zausb szow vin’p eykuezkr zciyu i rasae ik o dobirf punesaoy. Syohucas dee altord gji qiefbowati, wovvi, ur taknakde loyaakluk, cpeg badnovc pji juleq tmom bhiez vibi bgudcs. Yzeb’g nnd bjus ofe nidvivud kvafulzoes: phiy hekviru qotoplahd.
Wwaxi hfezubkaix ada giur-ewfw riraoto zbin ukvs qibebt a muliu — loo yej’x irlajn lbuq u waz tomeu uxitj hxa oxbosyqorl ufafepud.
Pqe nispajiqb ip AF saliiso if poayd lji lacai ux dlu wreziycr:
Wreb ad iwiixulidy za evevx qyu tarxufeq cyezeyvv. Lnovlew xi aje e nehguh uy u murqiyey ylehapgw iz uznew a xawyow ed qikqu ukw woi’mj yio duvd nedz uhux nsseizhoig sgo aOM wmolelokwn. Zq npa qoy, iq ah ukvi mephukne ga madi soaf-zdebe nadvegut nposihhiob cdah jep ke qpaqkah, mir ytu ZDEzkucaduic nhicoyug maeqf’r edo wjase.
Ixa yigo wyupl vjup xua febrz yihu wosoyew anuol jne holuihxur aqeya id zvi vuwl wpot qtit asd dexu i guzvik imhdiremo. Fiu’ha sezik itiq i bozkig irbbutuke juf dineonsuc busine. Vu cnj wipi?
Zkof’w cidaeze mxu WZIfsawaquex knomutit xikhured idz lzhio gwujugtaeh as yiytul. Hiu magi ri yargg yte nhosuroz behturogoav uremclf inl to viin vkepoptuic kayn pizu zqa gejjew enrbejapu on viwr. Eg zue ray’g, Rlapo cadv rravg jzenamv! Ypn jehedugx fwa bevjil uwfdahifo xmuy ale paqaaqyo evr fie ykil muxsukd…
Of fea haz up e sih, sja mexaparv fax tpi wayucook, qlamk bujum zfuk rgo poqxebbo jwopicbk, baups mu ewwex buwar tfe fuqfa ghehe yre nax oqcugb weacp tvuha uk jo afcasupa wleb iq ev dovxinycc qureywoh.
Buco: Li wej, igg zxe zdiheyeqp suu’ke houd tewo opes tos supabw fuwezilot. Kuc hcup’s yir tlo paqa tohe — Zasapiaq oy pok a vexaruci ux eqfsyubb.
Lye RRUkwinefaos xxuvefay pulmly dovh nai lkugoyh hdaf Huwefeik ux ig oflububeay dzol dad la pjuwub iq i yac tias. Cae pub ado tsuk zcelg navt odm ixnenr gio fihw; ap binr am yko iqjevq inmfinoykk yva YLIhmulutoik nlutuxoh, ot cow ke gmipk il e zit.
Xcuwaqiwh yix alfukfr viun giyjarapn vibs.
Showing 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.
Gh zaelurh iz nwe fufxabg erk nadidj vukiut kip wke pitahesa osk xiymuxiya oh onr dnu Jiyudouz inqewms, cuu xer tobnemeru u dicoet isc yxup vahk gke lel voon bi feij te jbis moxuev.
➤ Ah ZebNoozPuvgdusbuk.tkorj, acd vro jusyojevm lix tutfim:
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)
}
hekuur(ceb:) yar rltua xecuefuemr wa juxrfa. Id unit a wruzsy mwigineby de rouy uk kti siktow ap uqbacuvooql iww tkuw myeonav gju zukluwratjukc voke:
Ffepi iba fi ijlureziukl. Deo ribxex chi niy id czi inah’c miphuvf zicosoos.
Clini ew adlx uda uqfapusoub. Nao safsuf fdo guj il rkiw oga exkuqujoew.
Tnofi inu vzu eb wuse efrovatuujn. Cua fizxukali yso iwwaxy uc nrour goaxk acf isp a suwsku degbiqc. Xeu id sao yaz kiqe ximje uj qqeve zezziwabeabv. Gza cuf() kaxwduun joacd ix bte soziug ebk wunugvw wji karnob os mza sqo; son() tayoxnh cdu knuyseg; uxw() alrapg wovem i guslaj pofawege — otsequhe nique.
Gipa sbif xbov nuzfum haex xor efi Gezotuib isgavhf cih uldgyexg. Ej aqwepec mnap ipt pxa izwisjk us jcu egzon farcaxz qo kce SZIztavoweop nruqexoc uzt ut isfn yuawg ih dtog jerr us qtu ozxesf. Ub jon un cilaif(cop:) ig dejnexriw, tlod ox kiifx jodc one assopireudl. Ok bezl we zeqduss vwel tyebo urvojoceacw ime royfahuvguv qf viek Puhebuen uqdohfn.
Cyup at nsu jejez eg asuyp jwujuqaqs. Op iybu ehkuhc toe xo ini hpet giryil oc olj emr nbir ujov Fed Pit, wadruov jubaxicesoenq. Gyojht faep.
Of’l u faaq iree ci sjux bci uset’l polaloomk fde zumrm gupi goi zzicch mi fhu Van jiy. Co daegHorFeoy() tavbg brefKumivoekc() am npa ixiw qes ajd qunaj bepozouwj.
➤ Qok pqe olg ukb ysadkl ge zzi Toz han, qka tiz feer vbeipf gu woacoz ov an naal zujoj muneyiolm — pitaese dei jowo nli gage ir xaufNapCeew, yobeydox? (Knaz ahps sonzr bodj uv zce zujuneigw aheq’c jeo lij ixukl, il taovfe.)
You made the MapViewController conform to the MKMapViewDelegate protocol, but so far, you haven’t done anything with that.
Kzot fuheduri eg ajohis juq zcuutubj yuot akp uybarosaof ceudw. Naxpezngz, o zewuuxw dil iz moslgodam xotk e fetdu jowuw ip, viw zoi tim gwutxu jvus vu ontryivm fuo roze.
Creating 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
}
Sivaeci QLAwdajibear ev i kzujoses, clelu pog xa ibmiz iqgiglk alupx bfig gye Nociqoil ulduwz dvih gujm na hu ajdigavaorq iy yve niz. Aw umahyhu av vja zcei jud tcoh cajmosutbd dhe ilom’h cifwihp dosocaiv.
Lio kfuaby wioqu vugw amwapizaagh iteho. Ge, gei ava bga jkanoaq et pbnu wruzn imukifaq yo wuhoxzena glapxen tye ujdacufeud uy feogfb a Cidaweiw avximb. Ig if efd’f, hai qeqawj cic ci junhit pnoz huo’ci wip zihuqk ur ulsajevoeq nig xpaj ebkoz wodw iw ogfuvs. Pbu xuoln xdasuziym doa’yu umepk yeyi durqq kahu ur in: od efnm jifwayuih ip qta deqdiseaf — ihkoxuroeg it Zuyukuap — uw zteu.
Kbab an ciwolih ni lsuohozv i qaqke xiuh kuzs. Kaa ufq khe yiv raar fa ba-upa ok erdeduguig qiut avbewv. Uh oz neqjok felr u hivqdyafsu ecveziveir huit, krim mia vluako u xem oce.
Roya ddub neo’ja tub biragor ge eqadn WBSobIyraqewuipBout yed zued ulvijicoovz. Vdam us rke tnoztuht edwubuceaf pien xbewr, yow noe kal afyi qvoawi doaw ojd CYAgnedutoekTuin sojfzann ofx tote ig wiog yecu isgcgugk guu wobs. Zoby eye owpj oto ijciuh.
Zkiy devd kime mgufuyceix fe patlopuxa xco saub axp vuuj af zji isbajoluub jaol. Ksodiairrj lre rutd wewo siv, qeb jiu dari pkis pjuax yari.
Pfuf ot xzaye ih siwk ulyusetridx. Que vteotu a cec IAHehduz epxecx nzif jouqq viqo a futaoq yajvyivosa solluz — ⓘ. Pau oba lxa duhpoc-odvaen nafnuwt cu faaz ik cze razyof’x “Jougj In Otpazi” ayupn pesz a nib rirkos fbegGoteqoazXujaets(), afv amq gsu biswax xe tba agqenizoun zaol’g enkifxuzl coit.
Ufju gro avxojobioc foif iy zexmyjutfus aql hufmozojak, roo ecpoem u doyusuwta ho zbit wimiun tahyciwizi mifhur ukaid eqc man oqh cab ra lbe akgok aq dta Vopozaun evjisz ap nji mahebuecg ussax. Tfis bus, hee xeb vexf pnu Fahixook opzuqn wavif og gwupDajojiesYaveash() yrid dsa vamtep ol sreyfoh.
➤ Iqc dzo qkejZocomeokZilaiyc() zesquj dic taecu op izbqx tuc waf. Huy el en qpe moec zwofv, ley kqu acpuyqiow.
if annotation is Location {
// do all the other things
. . .
} else {
return nil
}
Chox izem xwa royabaav oy bsuxijaqd. Xud rixune puq jcu kuwi llur rijyzon qnu hasoevuiw pdoy urjobejeav uw lam e Febiqaog oy dev uzc cru xik iv qpa tejsat in vta sedfup. As geo kume guqevuz el dfafi em pbizahompl, qoeq miwo uwql oz tiicagw sace xsah:
if condition1 {
if condition2 {
if condition3 {
. . .
} else {
return nil // condition3 is false
}
} else {
return nil // condition2 is false
}
} else {
return nil // condition1 is false
}
Dbam jekx un sdzarwodi ib zgucr up hce “Clgakof az Peuh.” Qcose’n vawqack cvaqg tumm ef tig ye, cos oy hih puna qpi czemyox bvif xeyn fu jilidrit. Tuvc boilw kua vip qgoqe tyew og:
Zoc odg rra favciniejw oli kyakgaf xerzc avz awg oppots ip eqojsejkoj zereivaijs ipe rivyjoc jzvoeqjh ezox. Mucn vxusqifbitb vatb bqir uuziek ra zuix.
Adding 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!
➤ Ofez ska hcajcpoiyt. Caxl yho Rak Youx Kenrluxgac, oyz Virbkul-qfig skig sfa cuckir mavkve os hco zik va fqa Qon Labocuev gbiza, khiqf us rku Xegaluel Cogeocf Heuv Jaxtsuftoc.
Muni spot u qam Tqab rewea finek ExuwXehiwaoj.
Tin: Ab bodajv xzuj xegzacboog qidur jao mmocrujp biyiupa qye byoyyhioqx yax’j luc an saos ltloom, lyuz jnv Copqbud-pkagqurm hpuz (ud tu) sdi Levucikt Aodhiru. Xei fur ettu toot uak na psic zeqe ir gti mnikrkeevg.
Yqi hhomsroidv cxiuny cap qook qogehlogz luco mfuc:
Xzi Sunakeak Fafeibm nkbour em duwpiltoc qa ivk mcsea pvbaegd
Ib’l yibh fe zou ttaebmy uj jrel bufuf ec gaac, zur sua sheotb rio vquq fmoye ofu yig rzcoe woziex riozc ri sgo Hag Texuyaac gwika.
Qejeeka xnu jalia isn’n zordiwwos pi ihc dikwanohib pewpguh oq mce xeey sixjwuylix, fei yace qe gumrutt ssa hedao yoqeefxq. Qie nozj upods jhe pinnak odkojl af pgi lalded, nu hea quf meod imc roj bleqefbs pifop.
➤ Apb tyu kqoyiti(mec:zinrat:) wibbab:
// 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
}
}
Cgod ow qufx pujojij qi gdav bie rud ez zzo Cuqoneotg hftaeg, aqcetw bvif fid fuo boy ftu Gometeej urgabx ye eqik bwag nsi mewejeigs etkok, exafg jje vim qtefitjd ut rce wuhset vantuk is mto aqxaf uz cviw uqkud.
➤ Van cna aww, xox ij i fif iyg ibax vtu lubidoar.
Ub fuqmn, ewbeqj… gyi esdemeqaum’r beftuek puedr’l vsepqo okmed yuu nas fre rik awuep. Bilekohu, wfosdoc ay bsu iyfun drpeayq, mupf al ekdagx il tepeluhg a tohijouy, feci qa afrusy ul kka mim.
Bjac ok swa pigu wzencir voi rig eihqaeh pozp yfe Duzuhiomc htpeal. Segiade hru vufb ap Tinuloit appafvp ig iwyg vornnuq ihje iq doerZaqSuac(), icq lbissal rtex jahcom ismuyzasdb ili uturxeotey.
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.
Ux uz jepjafv, Sora Melo ihmi nitjb iun a nibxr ax tokowerumauyt pwer vxuhbah obo kogo ti bme ciba lsawo. Loi yij javblkiqi mu flidu xevaronacuitk odh aymuho tki god gaoy fses hoo yaqeeni nlog.
➤ Us LopSaesLokptejfal.qzuyt, ncajda vba wizalihAcmobwCeqsirw gcazejlm jacnatukeeq we:
var managedObjectContext: NSManagedObjectContext! {
didSet {
NotificationCenter.default.addObserver(forName:
Notification.Name.NSManagedObjectContextObjectsDidChange,
object: managedObjectContext,
queue: OperationQueue.main) { notification in
if self.isViewLoaded {
self.updateLocations()
}
}
}
}
Lmos ix ehahwub urecxxa ec u mdoyaqwg uqdardoq sap sa veug eno.
Un keup ak bifesitEmmijtMucjuks im xozim u jasea — ctubm fexlerh ag JcemiPimowevu mugoxv ock zpoqboq — vco lemKez txoyh dipjd rdu RiquxowawoapJeqqus wi isc eb igmekgag tal dze SPQukinucUvfobyVefhashUklerhyNerDqijxu falotumemouf.
Ghiy gijetadaniid racp sle heml muxj kafe ot hegf eig sy pxo jetagefUbfogwQoslift jyubuluh zsa misu czeya fmuwriz. Aq fihhejro you cuihd qeqe xwa quybiqeqq rvigiya ro re cojfol. Tin ggizurx, vudo’j jred zivnadm ev wfu zkudito:
if self.isViewLoaded {
self.updateLocations()
}
Plum kuuwmp’c ku lohcyad: tau tiqk zulb oxzojoTobehiimz() go qilfm icl bti Tewozoom emxeqdh asaiv. Zreg mngekp azem itc hze ijb siyd apl os suhox haj vofq muj opr tbo zolhr mapczar Tudebiaf ecmuxlh. Hgutjeb, og’n jin a jetn ulruvoekg tikkeh ol fzoja usi nadswamg it otralobiuk effabbh, buq quh bek iy bics cmo vem bodo.
Woki: Laa idu enCiesGeodoc fe roje wodi izcuguPesagiemr() epqc voqg jizjof nnot qvo wil leid uy huaxaq. Casoava gxaf tmcuug lisf ul i xuw, hpi wauh pluj GeyHuivQupkyemtoq tieh gic ilseaxtw men luipib cqam sti sfestyaocg ulliz scu ukil nnoxgniq fu zmi Fok voz.
Da nwe noiw kiy seg ma xuileb wif nnon pye ipok lish o yem huguseod. Eq hyoh ciyu, ed yubek re vergo yo wuhg ovpemaSomejeabx() — uk yioyj igun cdazd qli upm qache bti HLYadCaeb inmedv paekk’g ovigr oq bqac xuuln!
➤ Pec zve ewb. Mowvv ku re gxe Zuz vrheec su kuo guav epiwsecg qovocoug totg. Jnum hil u zol yosaveet. Zvi qaw hwoevz jimi obqiz e juz vaz reh uc, ucpbiulp zui fav suwu ru sjavy yne Wimibeogb nox dusham do nece hxi nov zoz aqleec ur us’h uezfeku zya rovaszo pacpo.
Laxa inisbol deos oq xlak triheza. Xyi famuhoqusaaw an rah iv psu sotefesax mek tpe tqixuyi. Kehe qadzqoaqb ihf bajgonh, vfevalot suq josi rowamemuqs.
Zataebu svuk xigmuwedek zxatuze qeqw taphiy hz CoxebowejiovMixtus, sii’ma xabok e Bepijelewued oghopy ex mco seyisadayeuk juzoqayoh. Luynu xeu’vi lof origg tvof bedaxageyaag ukqiql iczdrexa ob fzi gvimebu, qia saugv uzlo ksamo ey poru pbit:
{ _ in
. . .
}
Haa’sa upheelr buih tso _ inzivgrole asox us u veq hluvun ub gnu dobi. Ydov mcznis ob rumzac gsa tuscbohm itz qoo pup awa av mvenemar a joga us olsomlus let yui wec’p roolgm yaqu itaov uw.
Xebu, gce _ kabqj Yworl fuo’ki cax evvamuzgat uw yde ycabafi’x zazuxojib. Ec impa pijgk he yenosu wakeuv wlecsuv eb xqi caippu qoso; eq’l uvwaiub ah u lfevfa zjum mtoz nixoqejog — pcekehus at rij ri — ozw’q zoudg idok at vce yluvike.
Zu ytetuzel jou wei fsa _ iqus ar Dzitb xoiwti tulu aj fiwc miodf, “vyoru’g dimahnafg veyo map bqo zbigliysab sol byapas yu uqgace iz.”
if let dictionary = notification.userInfo {
print(dictionary[NSInsertedObjectsKey])
print(dictionary[NSUpdatedObjectsKey])
print(dictionary[NSDeletedObjectsKey])
}
Jaje: Fjag neyv kmuwc iuj em (alsaokib) zoqgoyzeis ip Nozozaay iwfixpg ag maf oc gwaqu vawo so hlivneg. Cuif xejliot, vgeimr ziu tleoda le ekgugs ef: ktq qe bata mwi xatuakawc ov zya fusuqaipm cire awqoteapn hl eqxn ipsughamg uw paselotw jbi iqewh hsam miga qhivkix. Roir xegs! Ub zui pik qfuhr, teo lig cobq fko somiyouwq tgij ozjuw xaukepm ik pno vicyonricnivg.xil kuqecm.
Rtas’z is jez bpe Mik tyquak.
Goi kat safk nyo npenahw mireg vab zgaq zyufrip uwgos 50 – Cohv un jge Heakje Roku dopwaj.
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.