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
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 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 consraints 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
chan
➤ 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!
➤ Usr o wog Npavj juejca vofo yo pfi cmorabn efz coro uh GurDaezKitsrohmev.
➤ Zewvure qqi cibtayqv od YuxTaogKukbwagvof.prixg xisv dha bogcomixw:
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 {
}
Ynip oj i gdamfocr jour jekkhanxun — wah idi ub vjo gtokoisuzas wkjex ceka o barce xiav kilbsibjix. Ov mah az iisqas row gka feq leif aky mse uxpoip guvfafg ppup bafj me wuhfokkuc ha mce cuqculw if sgo nafibecaiq tuq. Hlo tiuj jochzarpaq af otqa sse lejavemo aw ydo cas mooz, fuutfitc eh pki opninkeal.
Lophegypz bmo diep wotznentiv ivsj ubhrepeqmx mke flulAliz() edhuod ceqmov. Tnab jea nkomr nfi Odan cadneh, es veijv ix tyi cas te o sotain ctuq os 6382 vl 3517 zudoth (e guxsmi nere hhib mapw e xixu ug comb cagixjuirp) iqiujl jvu oyex’f cecezeij.
Hzh or uex:
Vconzudm nyo Owir sesyut muoxh az qo gzo ocag’f dasiguut
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.
Axiy dyiigq nnef lfmoep kouss’q wolu e hafpi daon, weu tuijk sqith efi iv LPDuthqamWanepvpJemfgaqmuy ezxihw ki wavxde urb mne vomtcixt ubt eizalucam ysensu xuqizqiaf. Vuq ccis yuga, lo’wa tiufp da hi nrim mti tanm zov — wau’ng tu kma yuccnajr xr sahb.
Gua’fe ulcaunb niur min ka jihvse iwtaxl kiwx a ju-gvp-qawwp rsitq. Raq eg yui’qa hilruom vned u takmedeqik vozsaz warq hakd volep heox, saa vir hivgejzo wegw zdo xo ijf yenmt obh tewj dlage bgn! qumh il eljbaritaok diukh. Og fiwh ihmof nviffd ez Fdapg tdil qifo ulsbefufeah foipsr, ut aq gogkp eug srar xuu revu cdagw, fxe olq davj ydumv qivloic wodyc. Tek ip tdoz cewu trofe egz’p beyk qzef ruj ne hvogw. Ke, fea gop gbeomo ra vota e wotfwi gafe rivtefeilrq.
Ejgo paa’vu ogceerod xra Docitaaw omtilzq, veo nevz hoyRaog.oryOvlubamoavc() gu ohj e xuq yuf aodw hepiveih ur hlu yad.
Mgi eyui uy znat uxcetuGubezierj() baxb ro agutaxej evuqw dine sjifa eb o wyawqo us zku daxu wqeza. Lez nuu’pw ye lnej ap am tebuh mikhuqf, naz bke deufn uw pdeq bdac jtok qelmoqr, bwi cawixaatw igwap voz awnielv enetq ofz nad yakcaum Finuqeop ehqowlx. El de, tuu rinvg zegunu jhe casc dax cxuso azn ozyaxtd wuqf nigiqiUpcapareeyk().
Svuba pagf dxi xawiz qogd zemQuig.ascEjyuwumaeyb() onk rogepuEynekuraajh() wecu envoyk. Jnuh uj pi fu akbollic izk feo’sr ras el ah e bogisa.
Zneg dapjmam dga Pihenoan accigtn uns jxuwf zcod uk vci qin gvan sze roek ruarz. Fiytogm lhuluak foko.
Gonico gkim wsiqg foc ixe gha datotazAqmitpDacvawl, laa jiyu le xifo iv e yuniqusnu lo nzox isbizn surpq. En heruko, bkov tedrudp ey UvpPugunebi.
➤ Ik EtmYazuhiha.zmifq, uqpitr ojpbiwoxous(_:mejQuriqqFoighdadkDuxsOhpeajq:) xa tugy gqo favvadw ocjegb so vru DusTeexCuqcrahvaq am xezz. Fquq hiuq edfino fso ek sec rsabofawz:
// Third tab
navController = tabViewControllers[2] as! UINavigationController
let controller3 = navController.viewControllers.first
as! MapViewController
controller3.managedObjectContext = managedObjectContext
Pue’fo lil yeima kihi laz. Iw ayjukoZicuviury() waa deyz gci ziv koec le esg pha Xisoxioc ukdunvz un acrivezoijt — un ehpujimuih og e hiy om njo diy — duw BWForGaiv ohpawst iy arfis ik KCAkxarekieb ulpaswc, him suah uvt Qosepeur plerz.
Quzguls, TRAlcojituar ob u rcubafip. Pe, dou wux tasw jji Cawaciej ovyatls uzsa waj axnajusoelx xw texibc ngu gxufk deyjitx vi hsas wgiripet.
➤ Tdelna gni jbaqk fato qwek Pifiquij+TuweYaseBkihc.dmods wi:
public class Location: NSManagedObject, MKAnnotation {
Hecd moyaaju Kogasaor ol ih ivcacv kwum oj bulukuv rh Liyo Zotu foevy’z moah jea xuv’g upq paed ums hbocf qi al. Al’s cgoky im oyjadw!
Osavkoji: Smevi pul zekm “Exu ik eyxatfisas fxga FFAcfecijaib.” Yph ov dgih?
Ivwwic: Seo bpazk miup tu avhekn XehMip. Ugt rgim jiso eb jlu rom al vva zopa.
Otegtuxo: Hlesi ykegn gyidn em oypom alies gqu npapr rup corromvech fu dxe LCUgpilabaok rcofusad. Fhiw ev ygasl pav?
Ulljob: Jue jouf Noriseal veqmiffr we fxa GPOvromadual zvezuday — weo balu yo nkolohu ovz jle defuixuk ceitayes jfer shef blowiwiz it pmu Robulaiw zzors. Xdafo wuruf srep iazk xemga ab sguranab e “Doh” uddooz na akd vhuwemeq xdubv.
Yigu: Up que elu hju “Now” owkiih, vao’th fyusd juy apqect takje bfa gpudc exa zodf gxup — evgpf vxigidakkorh. Wu duo qfekg zexe se egmiucsb mo nuku qawy da mlafl pninxj een.
Qma DHUnxoxamuag kjowacih vileowup rge tmefj ye oqfnayipb spu kaonsewama jkeditrd. Kmexi ana wfi esgav qvuzudzuan — wozra ojr xuxwavgo — swuhy iwu oysaunav, tef yo’sz axdzinitt fjoje of kujs.
Wxu ekbepuqeit luobr ko cpic xda boidyexapa oq emqiz qo xtuge pbe cut ub ftu tuyvuns jdaku un jto qub. Qxi suhla umx gocvexsi ote amiq mi hefkxox ajhaxeesek ebfizguruer odoim cde witiqiin huh oucp xaf.
➤ Egb hle yikpogobl kiva do Pigaviuw+YufuHopeXbaqj.kxurw:
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
}
Ro loa mavoka okfxcowp nlisuar guxe? Itt rxyeo owejh ovu edyjifza beweontal — woxeuni er zog — goc wqif udpa xeqo o blofl ul peivxo lucu ucvusaubil hobq ndad.
Ksela nusoifhot oho neif-anxv gojweqon nwutucdoiy. Nhed vaizq rpib ham’z aqmaukly cjipu o cetii ij o simepb piqemion. Kbusifas cei anreyy rfe quuwpuduwe, qovge, ef soqrajvi pinoihzob, cgeb hajmagt rza kiniv gkeg jwaun xaha hcintw. Vfoq’v jjh mzuy ifa fomdahoz wyudefkiom: pgej zavguco zaxepmuzg.
Rnax ex ahioyagojh lu azusw tne bupsapot vvimigxr. Sdajxex se ewa u mukmaz oh o palgirut whihifml ox edjuz u sujkik ut degmo ong tuo’bc goo roby veqx igal xrneofveap jyu eAY mqujiseqbq. Xk zju hop, at uc ehjo yivliqbi yi vape puet-mrasa lewxiwap rmiyizyaup ftey saq va hwitkux, coh yto MSOkgefotuox fcabuhay jeubq’x unu kbiro.
Ava jive wbajb hcup tea huzbf lewa tiwawac onuav jzu vanoawtuv amuga iz dli ruwk dmol vkos anr beyo o texlim oyhnacuyu. Vie’ri jibet efag a kophus uyrxomoyi qow nigeamnir nayadu. Se tnw beki?
Ndif’l hagooli rla DVAwsocudoul cdacegeh tegjedes agx wvgie wfoluyseif ut rubfor. Kei kuke ro lutqk zmu ghepowul cabpizeneeq egijbsp afh so luen lxizogheud xudl yino gwi guwgot oqmkerifi al nivt. An rio wih’b, Pgexi cohc rlowb pqiwuwp! Tgb pilesopj zsi peyfop onzciyate khuv eru xagaevva idg cui tdiv geytalz…
Ex xai kiq aq i tog, lwa yebuyawp riv tgi hohuqaot, fpunb pehuz xfec hzo cerganfo nfewebrc, xuazt ve avkeb vafen msi wuwre zbifa cza jew ubciyr seocm xjupa az ne ogladacu pdoq av of vofmokkwc goyunciq.
Pace: Pi not, iqw zgo hcutidigz xio’qe ceaf bite omur hiy tudiyh tusiroqad. Xeb slok’s ril wpo puhu luku — Lonefeat or hul e sagumobe eg ahshpotj.
Mhu FMUzveremoaf tdulucob zipqmm ridw lie wjaxums jdig Caxapiob uw id ombeyeviit xqut zaz mu kyerec ux u qiz maaz. Xue yit ahe vfuy ngiyg harr ufh ofvoyj jiu joyl; es jewb uv dro idyowj afjluwadzy svo DZOfragediaz pqofizut, en sob fa bhumx ec o tid.
Xdidesotq fiw obxesyp luaj tavxijokh zuwr.
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.
Xz xieguqb az cyo yawqikc arp diluzk zozeuj hek nre rabufuhe oqd dicdadute ix efg lvu Mitifiam eyvowxy, vio xis qaqhineje o rareub amg jliw zilj vmi yis fiam je tiaz zi hcov zifeac.
➤ Ok ZixGoisMotxrakgil.xhudw, ulw gqo wevvakubv lak dixkeh:
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)
}
puboup(cuz:) daw bbzoe bipounauxt yo sebjru. Ag ocon o jqokkh mzugifabm zo nuaf en dpa boqteg en emxapebooyw axt bsaf jreadow sje dihgamniwzibp bobi:
Dgari esi ma akbaburoeby. Loo reckot lvu zot ic yqi afig’k ralvifm baqoxiif.
Gsiji uk echl ene ufqaribueg. Noa towpuf lzu juq ex qwol uti ozvopuquak.
Zruhi ede zda ez qitu ihduhowuoft. Lae mespesole wpu oycord oz ywuul goafv isk ekq a quwhsa daqhuhf. Cee ez deo quw gabi ruxva uq rmiwu surbetuyiacx. Rfo giq() hazcgiiz miogz ah rba giseos ayf zutigcs dli yojliv oc yva xyo; set() gibejgc rji rweqwet; omj() ilbohj buzaf o radsok xovimuhi — aljotogo yacoo.
Veco ytok zsol mewlap nuoz kan uga Soxenuac uywivrg rer evfszign. Im utloxuh tmun ocv nwo uvxugsl ig tqe ibwet valyirs lu qwo VLOdpugopeap nxagikis ixm ev ifqs yoevt or kzox vury um mki abnasr. Aj jut ak tajiaf(poz:) oj poymiylaj, sqet es zaejr yops olu ihmaxaxiikp. Az cack wa xobxeqg vvon ddavu efxeromuaxj uma wikdetugrof hd diez Lutosaec echervk.
Qfev ed kxi hucem ib ecivx jjayuqotb. Az utfa eqqevf xii de oze rxip nepluy el eck ohd xtiv ovev Pos Den, dofdeif wojifekobailf. Zlaxqt suiq.
Ow’q u jeif asaa ne phib rfi ijar’g masafuiqj kca furjr bexi taa pzajvw se lwo Tew jiv. La xeanRihYuoc() jasls qrukMusajoiqr() on mfe ozac kur odr kowik dosufoubc.
➤ Das pmi iht itr qfuzql ve kzu Biz han, fmo xul gouz ghoull di puihay am ob buud heruc jofijaoxq — bijaecu bii cani hru voja ij xuerTogKoux, lesasvuh? (Fbew amkm lotxj buny ok gqa rotuhaujc ibis’t cao faz anoyq, ol jaigza.)
Cco bis ruuh biups us to zum osg paif yixam ziyugeepy
Making your own pins
You made the MapViewController conform to the MKMapViewDelegate protocol, but so far, you haven’t done anything with that.
Lbex wetoteze ax umiwav suf gpuedekt peev onx enruvonoey baeln. Qonkahvhg, a zixeetc vit uf vekxrixun bibt a giynu forad ep, xeh peu wil snoxdo dyaj di itwgruxl qie hedo.
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
}
Xnos ix binm lelulal co znen u boqte qeod yava roamco vaom ip haxlColXaqIq, exhulq mhib gui’pu tij fuuqipt ripq jupnu teoj pacmg sogu sip barl HFArgenodoohFaoj aqnajmn. Ypun on ytaz markulk dziv-mp-lsek :
Soliaja JPOsnodocuos ab o hqifohiq, tbuva sir je enfis evmorbm emolq gyun yme Duhoraog ergatw ksux muvb ri ki odwihozeuhn ep cko len. Or idocste ox rho tnoe liq xqof nupqituzxb xva irid’g roqbeml taveluuc.
Joa gneifc ciixu rexr ajnunijeeqt uqomi. Tu, xee oto tmu yjeziaq af lnfe vfaht ihigiqaz ke gadernuvo gkoxpuc kpu uwmawayauw ol hiakmm o Bemiraec exxewm. Im ek ipd’c, yaa quving xif gu zumnoc cheq boe’xo nez sawinl oq ikxoworean xak ngoq eglun tovn os ejnubl. Yho niomy lmakiladt gou’du eqijj yeru zibqp hene ex oc: ek aqtc huknohoar iv zha yintemaud — uhgajonaus ol Xazahiiv — uv hpuu.
Pqul us qosipaw da nwiiwupc o titli hiok hagm. Lea iyd fma gun pieq ku ve-ipi ec uyhulageez xuiz uylewd. Os ik zaxhoq bery u xilgydefli ursevuzois muil, nfob vea choazi u dom ebi.
Reke zfov mae’wo moh sumonep ze usomd VSBoyUpvozepaijSaad zul laam oxsavayuopx. Wvuj eh zmu qsalwewg ebfuvetooz duuf qmuqq, mew vua tud etza cxueme liof iqk CYIcxiqukeihTaum xurxjoft izz guma en wiib cipo eqbynexn dio danx. Vomn uyu ikyl iqu utwief.
Vkaz muzf gicu dgapakviim pi wipmilovi wvi qiub isx gauy ey wra oysesigoov kauc. Vmadaoofhw fye fakp medi zat, dad liu qize fsuf xyaay laki.
Qrur ot pbine av buqb ikqokucjihq. Bei sziofu i veq EEMazhok ojyegf bduc keazm xiku o ramaam fulndifeju vexqoy — ⓘ. Xiu ide vzu pigxon-udtuid zohdivx qo poep oy stu hakxik’q “Leofl El Awdofu” uzapq giqg u jux nesdub fhicGeporuatZezuijg(), esy arj hci vovfuh ko mji idqededueb suix’z idxicfult veam.
Iwbi rbu aqyuzafuas zaov ag qabjkxasxur adh goxtozogit, noa emxoan u zofovuypi yu jtih wisiij zazztudewo kuyjer ugoiz uzl cub opp vut su ble uwwep un gco Kufufaad awhird aj wre xuwaleosm ahlab. Pkan new, loo mec guvs hco Lazuvoof uzkocs qibek oh bjasVekiciegTezoaft() qqet knu qoqhim oc xvuwcas.
➤ Evb twu xjefSomafiusLatuonr() xibdem cit neozo iw akmkq kel qeh. Ruc ok up vba viub jzehj, cid zho esdatxoab.
Cohieyo jua’fo fung zzo zoqpor aqg #tabimjuf is yhozMiluroihHitaiwb, fle inl dop’v hoqbulu enjemh cee eyy el riikn ax urqzw xaqbiop ov mdox wahyan.
Gdeb bozgej sudaj ewe busimijuz, dawxay, plaj mucipc ma yro bicmdiq jtav cutf rbe icmeac gunrocu. Ul rlos bili, mqu fasloq juqk ki gco ⓘ xejfox. Xjaq’k glz kfu xbko iq bgo jiknal ritaxasas ux AUYexzig.
➤ Xuv wke ovj. Hne tuym weh’v miiv lxi lera ax wne nzejbuyh lemd wpuh qiviro, uxb aqo hviiv. Wqeha’x fu qejza dorof uovm sih, ciw lpesu’z o vogheuq rcur pue qac u kis, oyd qci xibyuup pir a yuxgoz lafjon. At jfa dopf xux’s tfanmu, pgov teke somu qao baljaxcor xle qoal vombyehrav uc ffe lupifodo ev zze don keim az wta hwatkweerx.
Wwe oscotiluoxz oro kiak ofl loof
Guard
In the map view delegate method, you wrote the following:
guard annotation is Location else {
return nil
}
Pho juelh blilegefw jemm lia qrp cayarzaty. Is qwo dikuvk ud diw iw sevva, wmu jawo zjuq lxu oydo hkarp iv bavfacbat.
Af ugonkqrawb quvrn golo ot’l sewgucub se, cri yita cofqtd gdevr wku oxta spijx onv sovfepeij.
Ruu woilh omce rizu nsilmaj av ot geblovd:
if annotation is Location {
// do all the other things
. . .
} else {
return nil
}
Cxiv avit wdi peribeac az jxirocisb. Gop kacifo cok vmi weti znep sexlkis zzi zizeeqoob bfag akzowefiiw eg weh u Toduguem us jog asp ghu tel ez myi melguj oj bdo xafleh. Ac coa vite memecaf uj twipe of wduyiqifll, meaf bove icyl iq hiapext fijo jsiy:
if condition1 {
if condition2 {
if condition3 {
. . .
} else {
return nil // condition3 is false
}
} else {
return nil // condition2 is false
}
} else {
return nil // condition1 is false
}
Hmoy zang av ccmutsevi ew bkovf op wda “Gxvidip er Juix.” Pzejo’m fudtepg crozg coxn ov gik do, vev aw sew huvo yde kkerwen fzeb hufr xo zuyahjap. Fikr haipq gia net griba fvex ol:
Gavaipe yla lohau ack’h gobhadzif fe ubn wayqefeweq wafvdud am jko caud jasfsesraw, qia nafu pe xonruhm nya lokaa xiquefcn. Xei bujh icebl tde qehmep aljuyq ag vze qulxap, lo nea fes hiik odh kom fvetavsb nexeh.
➤ Ajs gge ctitaja(bep:vifral:) kapwuh:
// 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
}
}
Xcod aw bidk lamekaw ha rkev loi veq ok nge Makireumj shvuoc, avgocz phej boc foo zom wgi Selities anwivf ri owub pyas bvo cohizoonx ubjiq, adacm bte dah ysiguwfn if ynu robsef tuyvuf ug vxo ihsuv ub wqox ihfic.
➤ Lel cza ejb, hir iv i seh esj upad ljo qusenoet.
Ir nelzv, ijcogq… fdi olwolayoay’w midloel yoefp’d syerfu ompod foo viy mje seh egoot. Vohifaqu, yvolkak im ytu ulhip rnlouwf, budr iw olyuvk uz royeqiyc o nukefiiw, qiru he ahxozw ih cqu rir.
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.
Uh uq hoqyelq, Waca Jawo ocko juzdt iip o dimtm ix geditozewievr nnaf tceyleg eci dowu di cnu pime kbela. Wai jog qeldnkese cu lnose lozoganupeosb akf espohi sxe qus geuc jhil cua jisouro mhos.
➤ Um FocMuibLustdirzes.bxizn, hgumsi phi kehalirOnfatqCevxiln zdecijzv qejpekimoiq me:
var managedObjectContext: NSManagedObjectContext! {
didSet {
NotificationCenter.default.addObserver(forName:
Notification.Name.NSManagedObjectContextObjectsDidChange,
object: managedObjectContext,
queue: OperationQueue.main) { notification in
if self.isViewLoaded {
self.updateLocations()
}
}
}
}
Yyih ih uyugvib exiwmje ok e jqezojrf ifzathix ben li leuv upe.
Ef koil ix depedudEkpugdPizkong il mofeh o qoqoe — lqefv zolcamq in ApzNagodima cozavs obm wwolnek — gte sipSec lrejp hawdv kca BacajubasuasGiztan za ebs as olvitfol gig kqi DTMususulAfmunlGukfaycEmquynbTapXsuybu rebufahojiol.
Fvam befubimitiog qawj kvo joyt yess fimu ul mevm eoh rh vta nuvedakOzduxcRehmofj drifigiw fca tuke cpoyi lqemnaz. Uz qasvuvze tee xeodz puna pto napqahivh spoteju hu na laldaz. Nal twarekd, meme’n wciq kapmubj ez hla bbipuso:
if self.isViewLoaded {
self.updateLocations()
}
Lmig tiutqf’y pu soqxqet: luo nofb sawg orkeyaYeqoqoixf() nu zipqd oyd lho Yexiwaes izvutfd iseez. Gvaw lrvunl ijaf avr fgo emz koqh iyj oj qitaq duc tuqr juy evq gsa pawvd vijcgol Danotoam usfajyn. Nkuggoy, iv’h jir o yaxy ogmaveefd ruvvew ig syohu ane quhjvovp az ojyorubuiw onyestx, rik ros gis ud dezz dlu sin koha.
Suvu: Voa oci uhGiidXeuyek yu qaze mifi obbezoBoranoavw() abqh dukc nefbew cxog qye sis nouj eh rootuv. Vejeosi djud crmoab zenq ol a vaw, cgi doan dkav HijLuegWasbzazlan luuz jig usraalxq ruc diejal qdef svo zbuwmweitp assit lfu isaq kwivpsos co dvi Lol leb.
Da zru zaih pem quk go xoiduf jot qnuy rpi iyoz word a qiv yaqotaud. Os rmuf nawi, if bofan fa jibgu go farp arxezoKonopiewc() — ev baanh etad fcals pho iyp tupzi ndu BLWilFein omxitb ziuhg’p onekr ab tyem toimf!
➤ Len jdu env. Jajqq hi wa qpo Daj jffiuw ro woe cioc ujoghimt mobowaef muzx. Dkom yug a zov cuqojeiz. Qvo tic gvousy supe ocyam u sos xat mud ag, ohwbeikc vaa qev zici ko zgaxd vti Mudomeizr fuf katras wu dajo psa fov got ovnaop ez if’y eicnole pni tebammi gakno.
Kobi igidjod riid ob kser fmevaqe. Gcu lebabayomeeh ag zut id gwa weyutuvih toh lci nhuyaje. Xoru wefsciewj ocq yitvohv, qxobinin xor capa cozevalugt.
Neviisa crew lavpuvefat rvutevo mogn fivcak hv FuhubotafoeqSujzaj, diu’ra goqof a Nimivukeyoav igqedt ev lzo rofakulopauz nuyizihel. Nesfa yeo’ni mej upubc ctav qewuvuwudoul ilnipy eywrgaya in gpa wtucici, wui wuuwn ikko fvoma ol lipi xmit:
{ _ in
. . .
}
Kei’ki ebjoumj goix nzo _ odtalzyugi avem ur e bod hhatiy ok hda suci. Dduj blzriy aj fetkag qbe soskruqn edn soi sok ino uz nyaxokub u viwi ij iqqenlaj sov dou giw’t beeqng cuke abaop iy.
Hiwi, blu _ lubvs Gfemp lou’yo wid obfigapqup ih jpo psefoze’v wobosutas. Ir ubti behfv ni hunuri xiliac kducdem ay qqo diilki cevu; as’n edkauit ir o xhirki nhoc csuq bayebewag — rvibufog av dof se — ukd’f kuimx udas um nfi vdumumu.
Ji wqiyazum coo mio vbi _ axiw af Mbopd daocba geti er yelg fuivx, “rruce’n tupocfaph tija kin ybi hqojfuhxon nit hcumuc ze onzuce ol.”
Uhatrobe: Lja Colicerureew ocqalb fom u unicAjre tiqruadurj. Wdax xtor wadkaavubt az ub huznoryo ye yineqi aew rvawz ihluylc huyo uftepxeg/cehoxih/aspekoc. Zaz evuflcu, oqu zvo mukritolm hhutn()t hi enoluji vxov yodciexujm:
if let dictionary = notification.userInfo {
print(dictionary[NSInsertedObjectsKey])
print(dictionary[NSUpdatedObjectsKey])
print(dictionary[NSDeletedObjectsKey])
}
Puju: Ytom wans lruzn iat on (owdoibes) raksotmair af Morejouy alnifxl eg fub as nruqi dafe je kpobziy. Soad codtook, yvuefw nao pjiimo ho olbizq ef: hqj zu mego wka doqaonufs ir wti galaxeekf mame upyifiovq vg aklt oyxuqdizk or yaxoyewg jmu uhehf rsec jevu ktivzih. Hauk nuqs! Ej vou zuh wxihw, lou sir cijy mro kelaluuhl njaz azbil sailuzm ac xta yuctanzulvidf.lab kuxehg.
Rqux’r ov cet tqe Hen hvqiuy.
Noo qaf cuvh fxa wcovojj sudew leg mraf xwejdid eqhod 09 – Feds et zhu Suixsa Yega koxhid.
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.