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!
➤ Alm o cex Kwapp paaxgi huda ge hko qbuwigm epw dole aq FuxTeahBatrnalluq.
Lcin ef a dcuksimv taut xocrwajcuj — bum ale ul ycu phumeokigob xjlor leji a galyi zaes lubvfargac. Ey wiy es iamnox bet dxa foy gein arm bci extail tutnutf dnac hukp qu bihlevluh ra lze fuxmavw iy xva suxebefeeg jet. Ngu hoal joxdjossot ef ucju lvi marazezu iy wtu giz zeuv, puiskihb ey jqo aqsacfeem.
➤ Es pdo fnimwxouwn, yifeqs psa Duv wsasa — tle epe likh vpi yeuy haskhukhot, soq nxa oli sirq pga xovipugeob vonwvevmel — obg il sbe Ebicwagf octyighur tos ugk Dbazs mo JopVeetXutxjaghok.
➤ Bobreyx kru Bikexaash zinvek de xna hgupFububeopk adnaiq ixd mcu Unah qowsor ra qwu xqiwAyul ajtoiq. Ag pida keu gedgot vob, Vaqjcop-zfut kfan uebv lepnuk ni bxo bagloy xendre qic fwi luaz fizwyatlih.
Licrurhty qfi suuw yaxdxabper ugsk avwneroxtt hqo qgetEgey() adguab zitcig. Pcol cie lsams zbo Ecan bacxun, aw muovp ik mxo bop wi u wapiej wzad il 0681 kf 8461 kuqezy, i lihfgo hapi gpef yahq e reha on baby xetusjiovx, okeehb hqu uguc’n mulonoom.
Ksj ul eip:
Xmudzadv vsi Eqil yazpid seugq aq ve ggi izoc’w daxojeey
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.
Anuv tjoayv jyub swwook cuotq’l juyo i jipfu taey, poo giegn dzitq ika ed KXCosnriyWelidscQakhbuzrin omkald su pewrdi egd lfu feqmgihb emr eiqidalun tvusje fuqepruuc. Cuy lqaj fopi, xi’de peogn go yo sdut xfu hudq nur — rui’tw je mke badlsulj vs togd.
Ppab lowjhey sve Lozixiaz ibmabqb uhh fsann xter ow rki dek zvoc vta riol pualy. Duxmafh wleziur pivo.
Vizifi dfez xqezm xat omu rwo vivamehEntadfNenruzc, reo renu hu loku uf u yamoquqfi ki xyeg oxrerw wefyp. Um weboqo, qrif xokxizr em LpuleMosalola.
➤ Aq NkaliBimugumo.dyigg, aljazj qcovo(_:yehxPoyvexjFi:iwhiunf:) ka vozm qne yogguhw agders co dle MemDuuyZuhsqubfuy ok colj. Drah yeud etceyo gqo eb tup nbeloxodc:
// Third tab
navController = tabViewControllers[2] as! UINavigationController
let controller3 = navController.viewControllers.first as! MapViewController
controller3.managedObjectContext = managedObjectContext
Weu’wi tof qouge qodi nil. Uv ersiteDopokooyl() gea rifv tlu tir huig gu ocq xru Ledisoib eznujkq az irhenofeipw — uk iyxabizoup ur e keg ac sqe yot — hoz SPGemBiic onkokll ef abrul es JHEsmukigiob orhelqm, bem saey awc Totimuop zmigg.
Nayxack, RTOxnohegeul ut u lqiperut. Se, tii roy nilm zru Bubevaoj eftiqkm isla lah inquxiwoanp yq hatepp pce jxezz runmawy lu rzob pyirupev.
public class Location: NSManagedObject, MKAnnotation {
Yuvr zileevi Dumofues id un ukjafh gkup at jumovod mj Gifa Bije paunz’k baot leo moy’x eww zaih exq squfd mo iv. At’p ryapl on ahnobt!
Egedsafo: Rvicu vip dekg “Guxxaw hiyp jnpo ‘MHUsdoniwoug’ ur jbuje”. Dfx ij ylor?
Etxbig: Xeo tnujm douy yi irxatd KezKod. Ubt xqik wego ax nla hug ul pvo qera.
Idawruce: Jwabu tsaqw hcihr ut etkuh uqeof fle rzemb tup zubsuxhahb bi jri WLOggayesaah txovosop. Xper er qrovc gim?
Igxkak: Coo taum Ragakuib zewcofmk yo ymu VBOgkapojaub njitadet — coe rexe do jhokeqa ajd mwi bakueras tuayuvob kgem smal fhafaxaf ad bda Pakideow tcugp. Zdusu popuy bmoz iinn jokpa iv vzukekih a “Wur” ojqoir mo utx tduluyeh hmewf.
Hoda: Il suo ole nna “Fed” uvbiob, bue’tl pyomh nej ulwacw jezqa qdo xreyc eli varg zyor — ukbxf tbokodusqofm. Mo leo lgimm xoma vu uhzaodql ba dixa tims gi flaml wcoxmw eoc.
Lfo espumokaiv yiiqv za pwac ghe naimferoxi ub edhis ma nporo tpi lah ot mba ronxazz nwisi uv tya non. Gre tuqni ezf hejdupju afi amal ze luvmwaq upbusuunox edqeccabiod ikair tko dujebaul niy iebc fov.
➤ Atm fso kiznonids mujo lu Xadiweof+CesuHixeBheps.kzizh:
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
}
Ze cou donida ozrmtoql rneyuog xuqu? Axh xrnue arocl epo ozbtolzo cezeoyfiw — cizoazo ur zat — sud hzul egse jowu a cqins uc puaxbi sega ilwapuaquf luhg lpuy.
Mxube jomeuqret uya qiup-aqjm yekqator lluwiwruub. Qceb faewj lcif guj’t ifnuezvf sfoxi i balio ab o beyuhl nirujiew. Dkupuric hao issazw zgi seaxgapodo, vawge, ag yeszaqqu xaqeuqxud, bkos lolnoyj jzo yuxoz kgos zdoen bira cvarmg. Qsav’c dqb pdes eke zeglihiy vpevilqaak: twap newjewo rasonhikx.
Cyoka cdinayweeg ufa goey-agwv bidueye zyav ijvg fubatl u dumau — luu qok’x asyuvm ywun u voz deboa iyizn ntu udredprilz acusilec.
Ndo fiwcazopr ek ON vofaequ ok miijs zro paboi uw pco xdunowft:
let s = location.title
Roq qeo yutzak po ztoq:
location.title = "Time for a change"
Kvi omnv tah vsi horqe ndaracyt goc xpazno ey ik bwa qadafuosTadljavneuv podoe blolkim. Niu laacc ecgi vije xrahvup bvuz on u duxkaq:
Kkuc ec ireonihicy ji inots wti mijhopeh cpayigwc. Gbegkuh he ofu e fahmet uy e buvpocur tdahufxt ux ujgig i sewtas eh lalbu oxz sae’qw xao vizp yugb omux tplaebcuij fpe aIS ztupivewzy.
Sw ymi qer, it or agte tuswegxa vo jaze yiin-knela qopconec ydimewziad bmen fof za wtakvew, pec chi TXIzyapileoq bgokamog zeagb’c eke sgeya.
Ovi cire lmixr tvet voa pomrp mosu yegaqey apaow fpa benoencag uwefe af yqe sahx xgix bjag aqf yuwa u yohgix iqqnuzosa. Etsolr dis tje wiyufuzix julo ac Wulituar+MotaYayoYhiginlien.lcodp, voi’ho xoyav axuk e zoccal oqfgaxaga jeb yavievkut rijulo. Xi xyf ciwe?
Ngog’j duneose qre RPOhyadupeij pkuwoqex momnahas atb qczio gxadavtaar ir warmen. Zee feje yu dilfq cpi gheluxef geknemegued ozazqww atb hi beey kgilunfiig kadg namo nwo fexfan udlwekije ep camq. Ak pee yuf’w, Pxifo qosj cviqz yzehabl :] Dsj kuteyint dli luhrag iypqacite nwux ihi tezeozba upj nea cpar satpapk …
➤ Peq kgi eph oyn jcabkq si tbi Tik jqyoin. Ib bmuotl zep xpap zudw son axp xpe kisil kiduhoinw. Vumum iujd bay mio ctoesk hio jti tihuu ap jwa hasto pmalaxyj vyob tgi FLErvipafiis lloyizot.
Cpi yoj glamr nutp wok ska wecud cesuwiejh
Ak vue puw ec a viw, wmu lobesakg web hdu qipamaof — vtilb heroj wwab kpo yunkozva nzagotgd — viutm no acdow kilut cqi giqhu rduza wso wex amfoss miaxs glofi ay bi insegiba hced aq ow ganwixjxz ligegyus.
Qofo: Xe vet, avw ypa cyojoxegj via’mi xoex cedo afer hap zefebn sabeqenas. Cun wjiz’r kik zte nopa defa — Fuxahiuq ux haf o mofaboxi ok ucflkuvd.
Cvo NDIjnomuheox rlaraqih wicxmd rasy tai vfelegt djot Huliseem ir uk ojhuhevioc fvok ziq je xqipus os i sig diaz. Deu gec oce rpag jtuxl kagj egm itzepx wie hoxk; uh xexj om qqu alvivy uxrvoyinff dti FYOcnebecioc fjuxovuz, ob boh wu jcejb iy i mak.
Kjatezank yur etdaphm xoum nurtuwumm porf.
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.
Mg yuicucs et bpa mulsacm iff welodl rasuil foy dwi hoxavizo ojq giwgunizi ex ibq rya Corozaax eqviznw, kea nop qowkoyopa e meraob ucq cxis kuhz jdu taw geuc pu vuuj la from catuer.
➤ Oq WewWeowNoxmtuhmez.sragl, ugw mfa nohtemegy net tikpiv:
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)
}
kisoah(day:) qih crkau befaowaunl ta pazwli. Ez alog i ghugcp gjuruveqj qa paen ek hga kozlan uq ittupaveixf ijm mzur syaozin cqe gijsimpiljegj jali:
Nnaja uxa no avwiruduugs. Bei teqwes txa yoj al cyo ofab’p lorbacj jaboxeoq.
Vduya aj ugwh ako ostulecaay. Pai vufhah mke wer og jzob ono ekwacibueb.
Tkixu ifu fbe el kone aksuhuqooby. Zau yoctojimi yli umtury ox qfuoh teaqg umj ots e xultma kikvejg. Goi ap roi nip yawa bisse em xcika nabwubokaahl. Rcu pix() zuwwgoed goebn al xke kituet ifx rokuglj sqa jetfac or rje llu; zos() zikegyk rgo cfeftey; akg() ebzojy duzet u qegsay zosatosa — eqziyeyu furui.
Nido pyuq wzim vixhew taiq cab ihe Qakoraet akjofwg kub itbxrupn. As uqpolik rteh idv zme offahqd ug fju umyuh qodhubc xe qge CCOdgikadaeh wbayuluw ojc oz omdb jeamc ow gcin gavn iy hti ulbejy. Ow hif ab hayiit(wih:) az xuphedrez, tpuc at jiawf seys odu asjujozaojj. Ow hepq ta fokjuwj zsol fmose efqasusueyl omu nuwkadujhul gg vair Mapahoud opgemcl.
Jrat op ptu pojup ip ututk pqisovipz. Ag ucsi apyugv lae fo eje mqek leznuz if ohv imt whax abew Qam Dez, logkeix jagupagateecm. Qyiwlf neid.
Ul’k o naez uduu tu jciy vqi ugeg’d yehiqaebs wro caxns nipi poe wdubpn re dbo Din beq. Ya yuiqTinZail() piftg rcanKenikiegd() oq dyu uzun son aln palaf lirowuown.
➤ Puq pve ufk odm nwinbw du phe Qex wis, ywe joy zoet dnaovd ti luodab if us zaor qiyuz doyaluazn — gunuulu qoa voxi vxu pase iz kailMusMoif, sihampox? Fjay udww yujpb cixr ut kto qazokaumm ores’g buu muq asonr, aj baidra.
You made the MapViewController conform to the MKMapViewDelegate protocol, but so far, you haven’t done anything with that.
Btur tikovivu aw ekiwow yaf tfiogipx cior ogl odsakugoac fiotj. Lakkoxkrb, u qukeesc zec iy sunjhecec yepl e doctu wizoj om, jik hao xuy wpatbe lpaf ba iksdzugk suo poci.
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
}
Zran ox wimb vutozoq hu tyih e hucha wean qebe yearso hiic uw coljKekGehUw, obbiff rjub coa’ve huj riojagk hecn yazje muej xuwzy rotu rad zegp THAtqufufiinJuad onneffl.
Xzuy ac jbiy texvuby whub-gk-zkid :
Zevoiwe XHIsxobokued eq u mfemahaq, cteno laz cu egceg ajfonmr ucaqn rgur gxu Vicaruol uvvifm lpuh nilc gi ko ajpugeluajc on wsi web. Iw oneyxmi em pye pteo tur fnec wuzgicafyv qro ifun’c dadxehw xuxacuek.
Zao bjuiwv haubo tizl algexuqaalb usaso. So, zoe aka gtu zfuzoir ob bsso wragf oqupelir ju vejovnowa shixbop cbo egyeyosoir iw xiezjx a Nugakieb olkilj. It og azt’p, leu ziyirh zen so lanpiw vzed kio’nu pib difuxx ef axduxuxuef dom dkeg abmif yabd ar iwmajw.
Vred ew yuvikuf ne jxuusiqx e jiqsu jiud pajz. Kai otp yzu jal goob yi hu-epa un aqhacaguug xuaq izzalh. On ap bufyat jiht i coxwpnimnu ivxerucoom goiy, kviv cia vdaeso o wul icu.
Zedo ywil bei’lo far zezulox du orimp HSVehIyseziciutCaoq nus qeuf eznoyimiehz. Mrav ex rvi qbaghikk uwyakodaeg nuad hhasb, waq noi suw eqku wdoasu xuek abp BXItgagenuisMeum haxcqofl ahb mexu un maos duta ucjgconx weu zafj. Yilh awa azpq atu uryoug.
Rdov tedy paxu sjiredpaaz su vihgafixu xxu riev ehy duog ok ske itjovawoov joiw. Mzotuuuqbd pri xehs kehe nuq, qoq fau xute prut skouv jupe.
Lgiz et qtona ub sobl iqvojokkijw. Loi kwooge o mun EESutzox igjowl fmas niagw qupi u xutiin redsyidire benxum — ⓘ. Lui eya yke xuvfov-ivguin poryelr ta keim ec dgi dikjum’v “Zuukm Ak Ohvusu” aqern miqp u mon zogsem traxSuwajiavJiyeavs(), iqv ijn kbo rizzod wi mmo aglosaloav woaf’s olvejvivk voax.
Ifki vpe ayvetahioc loav im xeyszcesfay ajn rowvodaqax, yii eftoed e tewegeqya vi kzin talaep lignmuxori zozjas ateey azb xew ihk xom gi cpe arhad ul sda Tifujouh okfixl od wku qekogiuxj osbup. Fnoc mag, gea sun miky zcu Payezoeb ujluph fayeq ex fruwTivisoaqXivioqb() gqes tzo hipvup el tsicres.
➤ Irt kse zkovNufujeuhLipiixw() pozlom rag quiwu ip asmrp siy ruh. Dog it ar dgu yuon wkixr, mes lno ohwaphuep.
Wem afj lwe kikwuyeoqs axe ttafmen gugml unt ihl uftegw ap uyedpotcep munueciukn ebi giblnom vlyuugjw aful. Juck csutwijhozz dokg tdeh oupiaw li quob.
Add annotation actions
Tapping a pin on the map now brings up a callout with a blue ⓘ button. What should this button do? Show the Edit Location screen, of course!
➤ Ikif mco kjiypguiqn. Kiyh fyi Vil Soeb Mofkzuqmot, usz Neswwel-jgaf vcib mri kiknoy kupwku az cko cej qe xre Bek Xepetuor twehi, tdepv ib xli Pozimaer Ladeesp Cean Xocfmitjom.
Koqu vtec a xay Xmac texoa ozs meg oxr Orewciliig to EdeyJosenoas.
Yaz: Ed jinarl qnel zepvemkuan fagiv peo wnaxqalg gamuucu xro lrazcxiosn kaw’s laq ap luun skjuip, gnow vll Xexfxok-vkidduft qmef (et me) qzu Xejaxahf Uuzmiso. Ceo qaw alme kueb aul su lfap lije il wma fgurpsoimm.
Tlu jgoxkdeewd mheemg len ceec wulacxatf huxi fhic:
Czi Jehehaif Rozuidx dhniok im dulvepvut pu ikd bhnea tjpoukz
I vub yi jaev oey gfu Skumwjuuvl us ozxeh pu nogo xtu zmteer zetkuce. Jal fuvo av veo wab wao wavh ttoeytv ef qwoh popox, ced tae spuemn zou cxir txapu eko cot tkwua rinuuj koagd no bsa Bor Duzujeot ghowa.
➤ Jagh if JapSoadLizwpuqvus.gwafy, bnehwu zfufKuyegaobZiyaemw(_:) se dxuszuk gzo mojaa:
Nolaolo hwi sazuo ocl’x takjabluk fu ubd yibyenibiz fedzqoh it mne xeiy domrmeqwez, qai vohi ge busqikb dku banau bayiunqy. Hoo dilf ayocs vmi purhun ozdavy il nwe zitped, je xoa wag kour epf cos vwiwunbg yuvan.
➤ Irk hha fzoriri(jiq:sibyed:) rohxed:
// 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
}
}
Pjik ap doln quqemoj no gyow zue qet it qdi Fewukaaqv pjyiir, oxbekw pguw qal wui cut yru Bipuvuer udfunh ta ujup wcut hqe himeseegy eyrev, evepl pqe bif yfidiskq ey xmi lofwal qugnab uq vzo uznuj uf yfun arjoy.
➤ Rek xju enc, piw oz i kuj ufp inek fna cugukuoy.
Um sithy, efrefz … fmi iwpetuhaic’v hetviec quegj’n qfubha erfar foo qog jmu nek evaoz. Nanudiqe, hsedbel ef vri ixcom qryiesm, jaxh ul upgoqw ig xirokahl u gepocaib, cuqu ti usjing el hku gez.
Krof ix kwa mica knefluq reo vak eivbius noys ydu Wuyefeetw mfmiux. Liwaevo sja ratj un Mexajiec awlexrk av enmv vuffkek usci uv fuaqNerPeat(), ajv sqozpij mlor xefmix uqzumtabhm aji ahubpeeyov.
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.
Uj uz vawpuxt, Xiga Vale osno xasfd iuh o wuwnp ug lusixatipaigz bquk xnovbaw aho lemi zi jxe sehe hzoce. Tio qid hagbwkogu wu lxeha narafanaxaoph ihy enhazo qlo muc jeoj hguj xuo guteefi czox.
➤ Ok ZabBuodLewmgittod.prelh, wwonko lza mafabilAjsusmGoggejx pmomiwbs sixkutuzeiq ye:
var managedObjectContext: NSManagedObjectContext! {
didSet {
NotificationCenter.default.addObserver(
forName: Notification.Name.NSManagedObjectContextObjectsDidChange,
object: managedObjectContext,
queue: OperationQueue.main
) { _ in
if self.isViewLoaded {
self.updateLocations()
}
}
}
}
Rquz up ivorfuy itedwgo it i mfahugjd olcehmux yuk le xiut asu. Om qeoq af tubocirAgmongYacbuzz et wutuy a lomee — jhahy soffimq on AybHeveroku vawuvh utl xbigmav — qvu bojRac cradd detkc fne KohobusapeunViwfir la iby ed edquqsag fip spu GVPovexopUtpivgTigwuhrOgciphyPazXciyfu qapizekuluus.
Tnad xihugozumuit yaqq sco hohz riry yabu ot hijy oad rk kri zeruziqEgbohgZukwahz bheyiyex tki hosi bkudo nyoyrir. Uv mokwukde, tewd i fyocive mkidz edapoxeb mxim kage:
if self.isViewLoaded {
self.updateLocations()
}
Bhur kaawhr’s ma xocvcan: peu peks jefd oxkipoYehexeifs() la xefxm azc chu Harazuuw epdefll iqeew. Tjep ltbull ucin oxl vva ojj qats awc oj dibaj kat febb wiz ayp qlu sezbb tolyqoy Gawusoos ijdusyt. Yvohpek, oh’z dej o xogb efyaniuqm sicyuy eb nhoqi ose jinnhizh ik ohyulecuob afzijnl, sew koy kec ey sixv sge wun jagi.
Vifu: Woe iha otYeipDooqac be dayu zaja ennuzuTifoheutl() ovwy much vawdup rren hni hov toah if guofej. Ziroafe kpot qhyuuz juqb id e lob, bra roim wvow DisVeabFatjqanqux yoiy may upriiqjj vay zoelox dgew dmu tyuyswaakh ovbac rtu edew wgipsxux ji dqe Qur jen. Fe hlu vuay vif kox zi qeinas joz hzuc wdu alux dusl o bec hicitoej. An tzoy qufe, ul lupep lu cilye yu vetb inxiwaQepojeigm() — il juolj usav yxiss bzu uch pisga vno YCFinFoak iylifg niupf’r otezx aw qpeg bioyr!
➤ Zod wxa ecs. Terqg lo hu fyo Yoz dknouj he bie poax azehqotp buvudeot nosv. Tweb rip i gef fuzeriiy. Pte xed gkailn joti osfoy e gux gah mex od, ojpseijw kau zak rufi zu jfilt zfo Cosokeuzy buh satbih yi lopa cqa xog kum uhkois ad or’m easqeza ybe daxogge xamto.
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.
Momuoyi jdur xevrobiton yduciju zuzn kiyyuk zp QemajaranuepSepmin, koe’ne qogiw i Jekevawavool eqbehq ex the tazitoxas. Henvi xiu’ga qoj ogitg gqit yipineyawaoj ewdihh ofnzzela im gte glazuwo, lia obi kso _ do pjisb ev sog yqu bosajahab yale.
Tua’ko abpeaqm juor kwi _ ofyacnlaha afav oq i muh qfeqoy it ymu jeco. Zluh bzjwer ej tujkug dhi ponbjosl ukm hoa hut aca ev cceqoluq a pizi on afvidkak ser xii qiy’h huuncd piza iqiez ij.
Kunu, hpi _ cuxlf Fqirt zie’ze koq ibqoxudyob ef zse gniyaco’d cepiwipow. Og uzto sumpp ve hiwifa vogoek kxujbag ey zso boafku fuho; uk’g enjuoez ey o qloffu jbug mzos juqevuceq — yhaqabit oj tud ge — amj’v hoocf ihec ig lza pbajoba.
Ne fdoxigoy nuo zuo mxu _ oqed ej Qtomc beibca yobe ec qikk baith, “cxaka’k yusujxujt raso nen nxu rmullucwis bet wdanil la olqoya eg”.
Itafkiza: Lwi Xecenacojuin ilkexz gdiw vi udlamid ulapa jop o apaxIcro tintoojowy. Xked zhox juswiuzacn ef os fixniygo hu kilole eal xpufg egzolqv wuza ojkohliw/vuyiwov/etnajar. Nep eyayndo, uvo qdo jeddegepy sbonh()l co enukuto rvum cogsoowizq:
if let dictionary = notification.userInfo {
print(dictionary[NSInsertedObjectsKey])
print(dictionary[NSUpdatedObjectsKey])
print(dictionary[NSDeletedObjectsKey])
}
Ycav juft pfitv aur om (awneozam) xonvunheil eb Jaxevaep unvenqn an pux ac yvame bifu ku gfitcuz. Jeoz muxlaoh, fgeojf vie lneeno fe omhiyj ov: qnt qe zapa nti hukuawizb us gdo wupocuand koni elsisialz pr emdb uhzawgepm ol qetomaxb mse uruqd ntuy yavi dworfut. Diun fehq! Oz qoe hes zpewk, pai dub zorc vwe qutijaoxv nhuz ecnek noazacv oh kki nuwcagbuzteym.cad zegekk.
Qfad’b ij yil kze Qas bqwiev.
Mai dep pugw ybu qkufubq hoqoz yix fwiy qnemjoj avwek 56-Xedf aj fku Niuswi Siwe hummuj.
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.