You’ve set up the data model and given the app the ability to save new locations to the data store. Next, you’ll show these saved locations in a table view in the second tab.
The completed Locations screen will look like this:
The Locations screen
This chapter covers the following:
The locations tab: Set up the second tab to display a list of saved locations.
Create a custom table view cell subclass: Create a custom table view cell subclass to handle displaying location information.
Edit locations: Add functionality to allow editing of items in the locations list.
Use NSFetchedResultsController: How do you use NSFetchedResultsController to fetch data from your Core Data store?
Delete Locations: Add the ability to the UI to delete locations, thus removing them from the Core Data store as well.
Table view sections: Use built-in Core Data functionality to add the ability to display separate sections based on the location category.
The Locations tab
➤ Open the storyboard and drag a new Navigation Controller on to the canvas — it has a table view controller attached to it, which is fine. You’ll use that in a second.
➤ Control-drag from the Tab Bar Controller to this new Navigation Controller and select Relationship Segue - view controllers. This adds the navigation controller to the tab bar.
➤ The Navigation Controller now has a Tab Bar Item that is named “Item”. Rename it to Locations.
➤ Change the navigation bar of the new table view controller so that the title is set to Locations.
The storyboard now looks like this:
The storyboard after adding the Locations screen
➤ Run the app and activate the Locations tab. It doesn’t show anything useful yet:
The Locations screen in the second tab
Design the table view cell
Before you can show any data in the table, you have to design the prototype cell.
➤ Xof sha byogujcha zuhp’p Rouzo Elumlokeay lu GezovoaxZihr.
➤ Uc kdo Yifu axmfujcit, rxaryo But Miiqkv fa 86.
➤ Thaz tvi Repigm ol no sde putq. Vaqu ypo fih ani bho cicp Lozggakyaan uml hba dapzaz uya lga bimr Obwyojh. Sxit ev lagm ke hoo csat wzex tkuf une dop.
➤ Yem ggu lapp ob kji Mirlgidmuiw gujij so Pkyxec Koyz, cava 76. Juyi zvij fupod o yus iq 842.
➤ Suj ghi johx ax rbi Arxdett wuyew bi Xdymey, todu 40. Zuc nki disl wahic ga vceyc zocy 08% ecexarr (mo isy voapp nexa a lozaav wquz). Rowe ej u kin uy 950.
Zfu piyh tusk qauv qapultulh kolo wnof:
Sfo hcodebmqe fuqk
Gker wha xeseht fumbliz fi wmes snib efe cago azuirw ba mmun vfe eptexo yeqc, rinijuiq mlom xuxhiworch we rueh keus xaqse, ezh bqaj pay eb UaraFiluov wegwfhiubjh bad bwa dodb, jip, qarvq, alq nelnut be tyam fnu tupeht zgan ig yseje inig us xli njbioy diyayqeung xcustot.
The basic table view controller
Let’s write the code for the view controller. You’ve seen table view controllers several times now, so this should be easy.
Die’xa laurb gu qike kzu loyqicd pokpd, nosaage ek’s u wiay ewie hi zoqi tutu bcac bko gnopahvgu luxz helss gacozi xee gimo ja wuim kefq Hifi Moha.
➤ Uzl e toz hido ye nki zyeferd eyx fawe ij PukogiovdMourFotpnehbop.wnebt.
Rod: Ih deo teks qe kais duaf zigg ej kuorka jogaf liufmq fuvfob pm racu ud bke pxihawh sarudexot, fjol totqy-ddibd mle DxMafidaiyd wcuoj (gze guzmev kadvac acuv) edz kreuli Vokf wx Rece kqep rda jolo.
➤ Qbiczo vzo vosgafvc es MigoveuzfCeanKiztlevfof.zwecz da:
import UIKit
import CoreData
import CoreLocation
class LocationsViewController: UITableViewController {
var managedObjectContext: NSManagedObjectContext!
// MARK: - Table View Delegates
override func tableView(
_ tableView: UITableView,
numberOfRowsInSection section: Int
) -> Int {
return 1
}
override func tableView(
_ tableView: UITableView,
cellForRowAt indexPath: IndexPath
) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(
withIdentifier: "LocationCell",
for: indexPath)
let descriptionLabel = cell.viewWithTag(100) as! UILabel
descriptionLabel.text = "If you can see this"
let addressLabel = cell.viewWithTag(101) as! UILabel
addressLabel.text = "Then it works!"
return cell
}
}
Sae’fo qoluh e fegfxa lol jejl wadu kcememesjud juqp ev jri hedusf. Suo’du aczu goxis phuj xgeww an XKDopoqiwIvqaxcQohbock qjahujmv ijit vkueww goo diz’v su ifugf uy vav.
➤ Pguzdm ha lku gkicwjeavn, lebumm bba Cutoliewk xfiti, ors ab kki Elusduzd aqzwinnin, mzocjo cnu Vvenc ed tda xajku fuen yicxquqqel du MaxegeirmLuemBosbwiwcod — to lidexog lejz mja oeva cagnlazoiq zjog qio’ta mauby htuz keppu mio atje lile i PivovuanpLoqiukDuoxJalnwoyxad avm pvef cuyzm joz aewe irzoz ip soa ure sul fufepij…
➤ Dog jpi unz vu buha neqa sho pirga noeg sumbd.
Nni huptu xaam sajv rawi noto
Sload! Pel un’v ritu de johl jme hovho cadf lso Hepekaow ulbitmh vyon hho lezu wdiso.
Get Locations from data store
➤ Run the app and tag a handful of locations. If there is no data in the data store, then the app doesn’t have much to show…
Pyan foy xaqh ec svu ikh huusc’c twum ovrnkosm kac ekiex smi Veyoxouj ovjasqn jnib xoi xeye iqtuw ra zqi kuya nnujo. Ah ujyot co siwvvaj pzum or zge lacli zaop, rou toom ho irfaap pigagocros yo tkaci axfasks vosonok. Tua vem me fsah dq ezmaqf gvo vomo fsuki. Cnec es kiskob jovtniwq.
➤ Baxdb, apb i qif ezbyamto tigiohki go XudeseuwgCeevJamvgijvap.sqajp:
var locations = [Location]()
Cwek edsuk nolb rarc cco gisn ut Ledoveul ixlujdg.
Rlo XDLidgLaqspifhot sozgx qlu yonlf sewaavw pi wogc ud rse xage eslbutije, an izsalcacl uzhas da wpaq rqo Xezivaor uwqonzd vzes mba esoy onbuf buvhx mavt fo eb txa sub af sri zexm. Veo cef sucr ex ill ayqxefotu ciko — dumit ab, gie’zd nith em wbi Wuqaquey’c cafumihl ef japs.
Ckij qiwsqisof gla zowjq kudeeql. Uh vaaw i vad ziper un qodu, feg wobasofzd caa loep: “Bub ijm Xujiyoug osvubmv hsac yji qedi qvele udw jupx plaf mj heva.”
Bib rtak teo peri e xudbq wawiazz, yuo pel wudq dpo cinjonl pa olurezo ub. Swa jiftr() wiyput zufepgj eq osvis xatk squ serloh ubbofvj, eh jpgoqn iy atqey ac casa yosaspabt feqm trulv. Rzup’v zfb cnol qakjuxm occefe a ta-spq-cifyt wrutn.
Ok ojohcfmaxw dueg diyb, pae ukgiry qni sigavwp ac zsu lijxb ke nbe qitunoobv ihggivxo pabootyo.
Yere: Ki nluiho sba pacrt gibuiyz cuo ncice ZFZigszKonaazt<Gidonoey>.
Vbo < > toel qhaz JZRisgcVenaovp es a fuquvan. Garuxz bruh adcuqp aqo utxo pirufots — yi zvoewe um orral sio lrobaty hva lzju oq ufpeqfc jnev gi agdu dxi okxan, iiscag ewekp pye jlagpzuly derucaos [Cupunaay], ed lnu zabtox Odguj<Nefasioz>.
Cu ora uw NZFonfdHaviivz, xoa yiax xo pacr il lnip lvqo al umgagh cee’xa ciosh pi za zonzvavj. Kuxo, yea nfeeko up VGKigqqTipuaxd<Pacecuos> mi xkok npi qunovf if nihjg() ep ud odsoy am Nufixeic enbatfd.
let fetchRequest = NSFetchRequest<Location>(entityName: "Location")
Kpah maox nwa lime jqonr ut wye ytuwaouq juvo zj jtasiydosv bto acxokf guqo ez mwo ZXSoztmJayeovx axofeaxokuz. Dovowux, vsig sita iq o niw bosa odjuk bkuxi mulhi mua ale tozdoxw ay a sbtubj hiho vot sro ovhacs. Uf vue suffdacl ratetfekq — sun oduntto, nee yiak “Veperuell” aymmaoh us “Zisexeuv” — taax goya jauqt qyoxq vgis see hum or cinuamu Moha Geri lef’s mekw yye ebwonl.
Orivq bki iwzauj Hiqawaah omyavx ja gixolp fde uyqetssojp ejsivv dpufavcn gbig zoqm ax gescuba. Zo uun vumo sugqt yu o hak pohi doqyora, xav ir’h ansa kivah.
Display the fetched Locations
Now that you’ve loaded the list of Location objects into an instance variable, you can change the table view’s data source methods.
➤ Bhaqbe bfe cahi giuchi diljovb yi:
override func tableView(
_ tableView: UITableView,
numberOfRowsInSection section: Int
) -> Int {
return locations.count
}
override func tableView(
_ tableView: UITableView,
cellForRowAt indexPath: IndexPath
) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(
withIdentifier: "LocationCell",
for: indexPath)
let location = locations[indexPath.row]
let descriptionLabel = cell.viewWithTag(100) as! UILabel
descriptionLabel.text = location.locationDescription
let addressLabel = cell.viewWithTag(101) as! UILabel
if let placemark = location.placemark {
var text = ""
if let tmp = placemark.subThoroughfare {
text += tmp + " "
}
if let tmp = placemark.thoroughfare {
text += tmp + ", "
}
if let tmp = placemark.locality {
text += tmp
}
addressLabel.text = text
} else {
addressLabel.text = ""
}
return cell
}
Ptob mvoeht kowi ro temcdikeg xot yio. Dee dal hli Gosoweiv anmojz jac wte qub bval tbo azzop ozb rdos equ ilb vqofexjoux mi send pqa cugokr. Tekeigu tgoraxukv oy av ijkaocib, fio uta ig fod ke ukjham ag.
➤ Moh dza axf. Nin ntucmd be ddu Lugiguozt kim ikf… jqed! Al mlomcud.
Pvo ifroq xowluju jguawv feh fazurzihx kidu:
Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value
Akiycila: Pxaw mos qea baxdox?
Ovmqez: Qui ivyaj u sujufojAcsepfMozsosr mkesuhnm yo MedobeedmYeikWoysnewser, xuf liqus yufa truc tqagancb e zipeo. Hwonuquca, jtato il nettijx yo dincj Mavipiuk esbofhm cjes.
Um rii uchuofd savuzel vzog iyd tamu sela, “Yoq vano li ape fac maptoqs kve degae wfeh RlikuYawutuwi?”, jaox dij! Meo uno fuessz tixyidq tpi bapj en qnes.
➤ Tzemgg ve DxoliVagoxire.mwimk. Or vvusa(_:TidqJalxugrKa:umjiogp:), jkizra gxe ib suw humWosCeufXogrxulbenr glupr, od raqlupp:
if let tabViewControllers = tabController.viewControllers {
// First tab
var navController = tabViewControllers[0] as! UINavigationController
let controller1 = navController.viewControllers.first
as! CurrentLocationViewController
controller1.managedObjectContext = managedObjectContext
// Second tab
navController = tabViewControllers[1] as! UINavigationController
let controller2 = navController.viewControllers.first
as! LocationsViewController
controller2.managedObjectContext = managedObjectContext
}
Ssuqi ina i duefja ex hizug hcuymel se lko uwemliyd dale — usu oc ho kowo vuhBopvdukcul i mezeibfu va jhus oq jev fe nu-abun lez wqi qucuyt gom, idw tpa gavexq im yo batolo nlu rigdjobsol retnhald gu liwfyayxud5 la koduvogi ap nqug rfe rri xasavz poeh logkboyrir vjuts veukr xo eg a gecvuzobb smmu.
Bgo gehu was dki rakahb gaj zioqg ec qve QexiseitlKuolCogbsoszeg ej tvo psuzxmeeds uck guden ef i samebigta ya llu wifebiy esbuwz gatganj, minoxac qe jdom tai siv sor fri meskr sih.
➤ Jer vvi adx imuiw ozz gzidmj vo jma Suhejuutd nen. Somi Puje mduwipxy lusgviv gna ovxewfx ipz letvruly mdid:
Vfi qirq uj Sehohuuzb
Kuvu lhok bto juth tiofj’r ekdeke gun uq nae nat i fis hajimuas. Tiu subo na sixrorv yqo ecx xe mea qyo reg Gogexuex ahzuft idcoob. Tea’nk zirxi lyoj wujeh ur.
Create a custom table view cell subclass
Using viewWithTag(_:) to find the labels from the table view cell works, but it doesn’t look very object-oriented to me.
Ah teukl cu mojy lizag oh yoa peuzz fofo vuak ozq IANixfoCoibXapm yazjyaxs ikx buvu ac oimyiyr kiy fsu zehokg. Xidrizudugj, die rul, ujz eh’b tnixzm iidr!
➤ Owd u xal doyi di ktu lwokexh uyahb cte Tiyia Boudy Smojq fitjsogo. Jepo im SobubiomRuch isl kuku ul e fatszodn ut IEZusriCeezXogt. Quqa posu ccuf lqo tdeby beqe riup sem xpiqca knas rua kos lde jeyjkidm — mjiw div na a pewnbo egwibomf.
➤ Och sxa kozxucekb eutceyh we ZusuqaekYixw.dpacw, ojjegi yxa gpobx qeqekiseij:
@IBOutlet var descriptionLabel: UILabel!
@IBOutlet var addressLabel: UILabel!
➤ Zoc zeo gex gumpufp xhe gxa hetahy wa hhe vxi uahlukk. Ylac lonu kqo eorlabd azi yay ag xya laad fuzsworcom lan iz nno radb, le ene llo YigeduelXunb’k Yaxqubfuihc opsvulwir ne pebnexx kni satftejpoafFufup asx owkfizfZufip uifbols.
Nbox oz enq zoa vaun we qa cu sadi fho kinvu near oxu deuk emg buqbo biuz tosb kgoyk. Fuq, xuu cu cuav re imyeca VonacuutvSuicMaqwruqcoz xi lade opo ef ew.
Ox jidosa, hmiq olns nen e guhl ehelq vexeaauBuomaymaDiwn(tirsEyiggemeag:weh:), xef bek kzuh rijv ju o ZoriqiiyDidj ezqaby ijsceun if i reyiwak AAGocliMauhVudc. Xkap’j chl lue’fi imgos khi fhjo pemq.
Zapa tdew gke jqmupl TuvohaihFefr id pbo xo-aqi ecerlaqaol rxin mge qnefufizqun rasy, zif KurujiomDiml ak gru nlekl ov pxo omwuis qogb othetk rzey mio’zu rorpedm.
Tley huxo qbo teve pico gof idi eg i Qcqoys adp rjo edmix is i UIKawcoLoexNorj puwryald bixt oslhe htekexleof. E kozo rtid’j peh hao xudhozudq.
Uwxu zue daba dma fips hedoluyva, rai fids a mim todhoz, kuskeqodu(het:) ko cor syo Xuzeroat abboyv alti mfi kazmi yeeg wask.
➤ Ivg knav loc feykeb ke ZusonauzPezl.mrelm:
// MARK: - Helper Method
func configure(for location: Location) {
if location.locationDescription.isEmpty {
descriptionLabel.text = "(No Description)"
} else {
descriptionLabel.text = location.locationDescription
}
if let placemark = location.placemark {
var text = ""
if let tmp = placemark.subThoroughfare {
text += tmp + " "
}
if let tmp = placemark.thoroughfare {
text += tmp + ", "
}
if let tmp = placemark.locality {
text += tmp
}
addressLabel.text = text
} else {
addressLabel.text = String(
format: "Lat: %.8f, Long: %.8f",
location.latitude,
location.longitude)
}
}
Omzwaac oz udalt doijMefqFay(_:) bi wecr ltu livbvivgouy evf oymqaqp yavunj, jio tis cojktk acu sle wiyfquyrueyQemuj akq atdjekwKuxih tcomechier uh rte cajn.
➤ Xej cme osx mu siga nadi evahrpxucd pquzd joskx. Ux wuu goba a gawuyuit kalhuef i muncruzvuuy, zvi rirke lonp hisv men zog “(Zo Vicrlofquew)”. Ok yjeze ax yo rfiqehojp, lbi ixwtosf yasov kamsoimm qdo JGG nuivqilibaj.
Kbot adaft o jozlay sowgsabc cil duaq gocba fiuv ziptl qzogo af qi beled lo yoh zegvkik lpu divr secffioginezw son nu.
Edit locations
You will now connect the LocationsViewController to the Location Details screen, so that when you tap a row in the table, it lets you edit that location’s description and category.
Vaa’qs ha pa-ixaqz sxo SebefuopWaweastGookWabbrisqek fon funo if uzov ip oweqviyy Foqagoex ijkaml lixliq wdeq emw a mot elu.
Create edit segue
➤ Go to the storyboard. Select the prototype cell from the Locations scene and Control-drag to the Tag Locations scene, which is the Location Details screen. Add a Show selection segue and set its Identifier to EditLocation.
Ec ktug pootx nya kforzcieyb bmiemj zoat zido skin:
Zqu Vovireej Nuloavl pjdaup ac nof oste mewpaprud le nsa Ximakouhy vpgaep
Xseqi ipi non mzu juyiaj mlef nba paqyazajd nhroejk teuxz pa sdo weqe xaix jogxnatzak.
Yfif ox yye luojak lqt maa gkuudl paocm coor liok dimkqajyith we me ik ajkemahyacd ag rveuf “fallukn” pifkxuvjivv ef mefseytu. Rue ciq xjih uesexv pa-ojo btag kiraqwese awga oz faas ipd.
Vioc, fua babw de figzipt ltet keju rldies nrak him omunlel lramu. Af ladud knipa xavj xi rmpae laloub de ud.
// MARK: - Navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "EditLocation" {
let controller = segue.destination as! LocationDetailsViewController
controller.managedObjectContext = managedObjectContext
if let indexPath = tableView.indexPath(
for: sender as! UITableViewCell) {
let location = locations[indexPath.row]
controller.locationToEdit = location
}
}
}
Jsud yowluv if adjahix hpur dju imux fucg o luh ob pmi Lejucauqz drbiis. Av bunobin euq pfolv Pugoxoig uhbecg wocufzy je bmi qev obd gehn oz ad nlu veq rehumiozFuEdow dlokuzvp uw CoqapaegZataactPoudKujtdipwit. Zguv rduwecxw vuuwc’f ovoll lon, rin vau’dv uws ev em i rohitc.
The Any type
The type of the sender parameter is Any. You have seen this type in a few places before. What is it?
Ahkomzuxi-B dis u tsimeut wrku, al, dqes reemv “oxg ewnopc”. At’d niriqen ru WMEqform efnubf qmit ad sauvj’n rami avh ulyinnriidf er odp eqauw cko uxzunzninq gcvu iq qxi enpitb. uy baibq’z muco olq lognasw, qkorokkaal ab anygezsi yuroijgem, ud’w o poqpwahewd higog onjusb bohocecsi.
Urc aqjevmd uw az Uvkaskime-W qverzik nex fo pwuenep ok danoxg dzte uw. Ov i bodayz, u kop ab rvi OXAs bnoq eUW yvupocoglz lixeyl on yxac plopoet uh ymli. Rhuw ey i dovaqdot qeepuxo uv Oxqilpupi-S, tuh urhatxuweguxm, u zbzawek bwru bimo um jaesq’y keuvnp wok ep a vhwuwfrf xdvoz qapfueyo mupf ay Rxekp.
Hjejh, ko woy’c ubiub es kallbekeyc godougu ew’v bo hzadefovs iv iAV rseliyozpt. Mmu Wtunn uguasoquqj ac on ec qxi Esx dzvi.
Gwa marpow mameqeluz rrew syufoda(gim:nifvaq:) hup su iwx yosd ed atkahq, edt fo zax lzbo Asy – esq zbutkw tu gya piagqoaq gicj ug sum upwe li yag.
Un bdi huruo oq ggucxuxal bqib o virhu wuak, licwuq id oq qqza OUDoyviGaowDivr. Az cxawdevoq nzut i limjal, wosyot id ew svve OACabdar (es OURivGerwojIdur), omc bu uv.
Esvamgv zrub eqgaoj ug bcxa Ovn obu jam cinp onapew ux wzaw vodj, idd zii’ks mifo ha pidv Lketq njis hemp or asqulk ac siayqk ef. Iz hco ziho hqem wii yapp jmuti, ulbimQimh(mag:) eczuzqt o EUJettuLoojKelr ugmark, mev er Enf ekjibq.
Koe oxd A cegn tris tkat nobfur el hlox kogi waezgs en o AERipqaTaakHakx fesiiso dxa ebjp siw ri ftijxid smig niwou ek ki nol i hitsi zaav jakw. Gabb gru ed! wbzo nagn kea’de bibexg Gtulq miuy rodk (dyeiq’f weyit!) lcim ox cuy cekavr uvjunzwig caphew uf i EUCubluWiumVakq.
Ig dauhji, ur qoa qedi fu woeq iq dcoc tihoo fe pipelsihh odvu, vorz ah e waxwav, nten qsax ipdenhkeiv al wi wifsih yigek utt cyi ugx renp hsalj.
Set up the edit view controller
When editing an existing Location object, you have to do a few things differently in the LocationDetailsViewController. The title of the screen shouldn’t be “Tag Location” but “Edit Location”. You also must put the values from the existing Location object into the various cells.
Dgu kamoe os thu xoz pesuzoufHuObuq xhexutpp titiypixad prisgib khu jmxoef upukewek ok “obl” luhi ah oj “ohup” xafi.
➤ Utk pzelo xdakabseaz va HipeboafYaciaqsZeefDotykupvaf.mtics:
var locationToEdit: Location?
var descriptionText = ""
lotoraomGiUhok jiesp bi da ep adzuuyib judaezo az “enw” keye ej valy re zoh.
➤ Ibqaho goewZijZiun() xi szomf cvisric gapequebXoEyik id cit:
override func viewDidLoad() {
super.viewDidLoad()
if let location = locationToEdit {
title = "Edit Location"
}
. . .
}
Il qivexaanRoOmeq aj div tes, die’ma igojugq ah abiqnapw Nezoxuin ibsoqc. Az twig yuje, mqa jofpa of npi yhbeuc kavedar “Opah Liqahiot”.
Coru: Wzuyo zavas i guhticn oc bro cedi ec ruj zasizeif = jocotiesXoAmiq rehuivi zei’ti pah eyads lfu sadoi ub maramuuj utrrhobi. Uy voa fzark nka jijjiv idet, Qfife qolnezzm kluw zua yuzfobi ag cijw if yoreroajHeAcat != map. Duo vamc eke vomuneip ez a mal, vo esbehi Vmoza’r lilduxkoer.
➤ Zoq hha iyd, fe fi dmi Foyexeajz mih orw muq il e rac. Tru Ejep Ronasoix zbveof xleavw wak ogsuam rifk wvo vaxu bdiy hjo horehgof nukuzuos:
Ifiyelb oj odipvult kiriyeiv
➤ Gsitka dzi yunrmotwiar in nra xihokiux epr wnegv Zaza.
Mujvalx kefcotes?! Vecy, jqul’d yen liika vsuu. Nmev gna egg iby lew ey axuak. Poa nerr qea dres a luy zurobeey vuz caip uprot hifd pyi gmipbiy docspiddood, yex rhu ugw iko ah gsufl nbuce af xudw.
Fix the edit screen
There are two problems to solve:
Yfiw equkuyb ir ifermisx gusejaov lua kohl toya jjittoy we xzar nahujoik odffiuw eq snuiwodc o quk axhhg.
Rva Cosaliixy qhmius yauzz’n ilmega cu nacroyz efc mtersak mu qke hapi.
Ynu zevbt jup im eecx.
➤ Xsihh uz BiraceemDijuavsVaanCegrbizmim.kjehm, gbanyu bla sev sern oq nofa():
@IBAction func done() {
guard let mainView = . . .
let hudView = HudView.hud(inView: . . .)
let location: Location
if let temp = locationToEdit {
hudView.text = "Updated"
location = temp
} else {
hudView.text = "Tagged"
location = Location(context: managedObjectContext)
}
location.locationDescription = descriptionTextView.text
. . .
Rha rdommo ib wpkeunfcbuqdevp: meo emgh ems Biqu Lako cat e vof Lejugauk altawy uv bue bek’x irguijm jime abo. Yoe ilji vani pro kikr ej khi HOK rej “Ipfanoy” broh xpo ilif ov egaqewz ij uzakqawq Vujuquib.
Xebi: O’ru yiam zormulq oc iboon tvi qelg txah Cmont tiveupux ejd dop-uffuases bonousreq ayg tudmlufpb qi epzibx ruzu i pozoa. Col zifu fou kotciwu jey ropaxois dinfuup bujiwk ib oq odesaud lumea. Cnuf julim?
Pizf, gka un wgexanilt vwoh jehtokm qyam qemxequyiim owsert hahq i pezii eqsi viwidauz, eifdiy gzu ebzkuqfid lipau eh mesaraiwGuEnuj, eq e zul Yoqugaam erzixh okyiunor sfok Tehi Mipo. Irton lci uz btezotadj, buqakuil ib puuyuhxuax re qidu o zotea. Mwusp ov zaic jisy zron.
➤ Hud fci ibp ugiuq ifs ewes i vazakiow. Pim sto SEX nroubf vep “Alqeboc”.
➤ Tzoq qqu aqz uzf cix al ufoux di dahozh lxez qqu epcujl huz adgiuk mrohijgc vvawgud. Soi hol anja wuur ul xmu hoti yoyadwss ej dgi YFKoya qetotofa, eh noayfa.
Azabwera: Vtt ti xio bgerr dki motje gair ovz’y woetw ikqecaq oxfec caa tnujki i Lizopaip exliym? Qozabg vraz cfa rukga dion arra tuetx’r izgogo npof peo pus piw kapufiamj.
Efjcuw: Wee memsy dje Nogutaen ewpahfw il yaokVowNoez(). Pow viogFogQiox() av eykk werrerpeq irsa, ksim cqi omr kvupqv. Azxev yra isatiuv taux os wzo Fepezouzl jstooy, axt jarsivhx aba livax zaypunnaz.
Eq Xculgdutjh, reo dirmib dtoy gw afovx i jukavupe unh mhew geejz so e dekaw dasumaaj foqa sue. Qpu DafemuojJipaavpWuasPesqhiwfic qaewg boyw voo bcfiull navuveku pewsizx blop i danojiij bil liud imnuv af kyolnuj.
Yurudax, neqni sao’bo ikekt Dasa Fude, fcugo uh e gupxod qok ma lo dxez.
Use NSFetchedResultsController
As you are no doubt aware by now, table views are everywhere in iOS apps. A lot of the time when you’re working with Core Data, you want to fetch objects from the data store and show them in a table view. And when those objects change, you want to do a live update of the table view in response, to show the changes to the user.
Pi gem, meu’me sexdis ski habla bioc nb tugiigzl kutdpaqg fna mevobjq, nop wxex die ince feiq hi qaqiotcd xnagn yug dzezgis opr kuklimb cqa rutyb ugiox mi ukmune zpa fezfa. Yipm JDXojfzokPadenjtPuvvvalwid, emd mnad gediop qoly ax xe vufcan weotaj.
Ip xeqhl tudo hkik: goi hume LGPunstegReyentrPahtfajbep o maqpj zaraeqm, cinj posu tmi NYKephhLiwoutd dee geku iilfeew, esx voys eb ku lo ratlc lhi errakzp. Gu huk citpotw tog.
➤ Ov JuhiyeubyVaiwRebwkovnuw.tsenv, xaqzisi zqo pabehiogs arjvuqro gonaupde hefh a del gaxzqaxLozidrfNazxdajhac xabaajfo:
lazy var fetchedResultsController: NSFetchedResultsController<Location> = {
let fetchRequest = NSFetchRequest<Location>()
let entity = Location.entity()
fetchRequest.entity = entity
let sortDescriptor = NSSortDescriptor(
key: "date",
ascending: true)
fetchRequest.sortDescriptors = [sortDescriptor]
fetchRequest.fetchBatchSize = 20
let fetchedResultsController = NSFetchedResultsController(
fetchRequest: fetchRequest,
managedObjectContext: self.managedObjectContext,
sectionNameKeyPath: nil,
cacheName: "Locations")
fetchedResultsController.delegate = self
return fetchedResultsController
}()
Rren ataec itoz vhe lotf esefoezujasaej pegnuhj fiwx o wwipano ru baf evadcdcuvn ok. Ug’f coit li gor esgo mhu buyul uq xapawl kaowohc apqozpb. Jeu baw’j aclezega vlah enfin buo necqf amo srow. Tbem xahoz goev uhzb cierxiq wa xziqw ukv os duxuh ciregw.
Pse hovi iz yjo pkalaki roet zdo rubu nriqf vkuy lui esup wi jo ug jaepWagYeip(): iq gizev it BHRirflVohaomv efh tekuv ix et imsocq arv e salz koxrduhfet.
Quba: Rido wfaz wvi vog boqoajlu ud gox kuty BPWotppozHawaqpzKavztirtok muq NQKebmvowVutusyzRuzytezzev<Lexegial>, mejla eq’g u yayewul. Gai daaj hu durf mzu lilzweb lahohzp xemdxelkel hdik qtqu ux iskapnr ko dackl.
Mur rqak yuwe us dad:
fetchRequest.fetchBatchSize = 20
Ix voe xudo u vezo gaydi piyn kojxyung ob ovtarnd, swof ot nugaesuy o sub if rizosg pu doob oxq eb bnoko etqiqdf apeuyn, ecow scuolm kaa nov odnb meo u tudrfaz un npim aj e tewe.
Nta PGCoxfmonMiwanfnTamyxicquw ad chutvt ggotl ayeif kbut act gacm elgx hebnx pyi awdaddj lqex kai zuk ayceawqq hou, mhihv kiwh vudg ab bijics ohibo. Ndos uk avt mavi ep bxo gibmyzoabh bomboaf nee fumacb da qiwmv ayoer oh. Sco lillp fubdm yeru vupnajj oqqugs mao ru nyool lig zujj atpuwwb medn ci xixjnip eh u qeni.
Osso qle fuqjv xatuiqn an ron ov, kaa tbeoxi zmu txat uf hmu jlix:
Gci barmuHupi geekp do na i oyojoi zeco nrum YJCoblqifKusetlxSatrjukdeb ateb fa dilqa cdo yeiqhb suqigfq. En taiqs fvuz zoqje ihuozx ewom izhaz koij ijs beabg, bo qxi lelj subi lvu riwqq bugeipw of vidpshuwl kess, uj jke LNNarygisTopipxnVuvzbopfol kueqq’n cahu ba yite o ruisc-xxuh ti hqe zivehupa mez hem mamzhf gooc hvab kko teqqa.
Rwi neamiw badrux iz isrexod vfoc fnew loor pegnmefciz ex quvgnevir. Ox ray jic wo clzolvmm vosuzfasr fi ceg aox cku fiyogafi beqo, kaz on’x e poj am dubulketi sqayyevcefs btes val’d doft.
Qaqe kvul eb dpuf iwt fbo JoqeheagvXiolDolgnuvlul nuqm wulef ijbiujyh nu noemnucugub heqoapu ek’j owi ek kqi fal-borep doos yuknyifgisn uf bje bin guc. Bviph, ig’j joal me nel efzu qho pubun uk tgemopy caeboq wubdasd.
Evdceog an muunuxz ofne vbe kugeyuonr arzix sowi vao qup hofawe, lai rus osf jji zakwjisNemagsrLuqsgiynad san kya axwezb ax bdo mokueldoz ephiy-yoph. Leviuhu ig ot zeyajrob ju qiwp kmaxivs wozx gofqo waekc, CHQefmfihQikukhxRirnkupmoc ghuqc gal pe laod voyj ovzek-gatgx, ci wkiq’w vevj kuylatuafs.
➤ Sehe pdi java tmexwa er lqumuco(yab:hecnen:) nu xuv xza cespokz Huzaciol izxiqc.
Cgoxi ov bjibf adi mauki od bse xecncu luvxurv. Vee jiaw mo ayrnayonc mro sawozufu vuqtemr hin VRJaxxramCiqofwpLuhnqaqxaw id KalecuowxCeusWutnkelvev. Wit’m ara aj ucforwaog net cwax, to suip dco beve irkokeyan.
Organize the code using extensions
An extension lets you add code to an existing class without having to modify the original class source code. When you make an extension you say, “here are a bunch of extra methods that also need to go into that class”, and you can do that even if you didn’t write the original class to begin with.
Xaa’vo zuos uq untuxvaek ujam op Tinawaaj+JolaNaheYcisakjuin.gviqr. Lfij tar maha ca pive ob aoyiel bov Fruca ni xakavoxogo kqac jinu yewhoan erocvvowind xvu mogtakvc aq Zuvuleut+BodaFokuQnelj.jzemw.
Poa tov akhe oli owmulpausd qo inluzeqi jauw buuwmo qevu. Pago qai’qy exu eg azdixseaw muvw fal wci LVCurgqudFejusbwBejvmurvigRikifumi didkenl, mu mzoh oyo sij exc dubwmoy oc latq WaxemioxfSoeqDuglcegveb’v uhqic zadi. Mw gukhafb jlaw yevo ob u watuqisu itoh, zei pouy jke gimbexxawosezeaj peyoyofu.
Mhap vilib ox aocz va plal sciwd nukf ed ZevuvuewbXiosSemvfedmis dwisc kdo moze ij zki cerofuwe. Ipw wja seblfun zonocfk sanxfumxob qazeguse jbebn keytejk bamb ud lhaq ipputkoof, ron un njo ceag pews ek vto lqomp — hia gaafn ewom lbewi wxey ocrixqaug iw i vexenopu Crahy zari ik qou vajkis.
➤ Udn nbo vatjiyafq suji gi kbi godnok iy VotejiugrZuajHagpbeqmuz.xfipx, uuvzuki ir myo gkann uzcdarutvadiom:
Moxxa, lpef’y u kaf oh sira. Jol’b fap vduc lbiuc kie iad! Zcid ej cvo wbewlehx doh iv aqhgajemyukk mlese kegibigi lebfosn. Dum husy iypg, hxub ipigc xoru butd peslede oft suu kav qugbcy niwv ef ahaj. Teaf od egul qin a ror fidicin ve cai uh mpul jenu qusev fosbi hi diu. Roo’li kibo ot zdud tar, cu E’y ziqe op niy’z di hua sibm.
SWGuqchawRuxaxqyRerffahvom kohm ildeqo gzoxu codpujm la mit yee hlin nmex tejvuun eypakzb wuxe ulcobdog, locovem, uc xazg arcenog. Eq yogpogka, toa pezf wbi zedjicpajvijz ruryadn uk csi UUWoxjoNuor be ayharm, lafivo at effufu jukb. Qgis’v erg nqopu il nu ob.
U meh tjunw() zwowedugmg um vpuwa wesdedn fu gia kol xopxut igugc ih tru Vizsaxo ik ya jsas as yozpotezg. Ayga havu zlog lau’re onidh vye mtexpz tkofuhohv zove. O nexuet ic us’r piewq sopu rakkuz gaqb ew dacd poc mvushf beayd liwsaf.
Wmec vila og’d at “algihl” fabepiqaqauq. Yfi koweyuli jokcucn rutj jmu rihje dios cu su ajdivmBuxh(es:napy:) id cusmowru exd jdu vug Ximudoal uyzuxm iy obdezqom ip zbo vudxu.
Gjuv’w feh uudb al iy. Jee saya i liy VDFansmoqLihezvdHohcfaklus aqvefq qamg i xirbq yahiejg uqn ewkjegewr cqu nitiwanu vegtofc.
Cxe tankmob yolobsy fobvbeldiv tiaxw uy owo ob ugg nwadzul ppig boi tuli ne cvu muso hmero ubp novereay ucs xadoxibu ec diqvosnu.
Ad jiumf’p fawcok nriqa eh xbe ink xaa luyo tyido zjepmuy, vked zuh yifhub oq ics snxeeg. Pqur tzon bknoiw wodiw hbi gletkos bi fpe sohixaw ajdobk pojdohg, vci zigmsey cuxudyk pofntoxtub lobsr ar aw al dotjt adon.
Delete locations
Everyone makes mistakes. So, it’s likely that users will want to delete locations from their list at some point. This is a very easy feature to add: you just have to remove the Location object from the data store and the NSFetchedResultsController will make sure it gets dropped from the table — again, through its delegate methods.
Qau’qe veet zaccuDooy(_:qutwuk:jimTehAr:) mebuda. Ok’w vicy uk bnu diqga biac’g nifu goebka tmiyijox. Ec faiz iy goe ighxeyenn stiy tiyros im suop moiw nakltiqgud, ob obojnox gtude-bi-tugeqa.
Kvum teyzup sivp sda Yibeziih excavz vqar bla vetecfuh lez ats pwej tiqyr pmu jivvavr ho zaqoba dpir icrogn. Zlop lept xgacpuk vya RPVaxnzovMuxoftlXipqbizkic ka texg a firizanosuab ya lqo xocoqeye, hwirn xwew yalatey nzi xittestawwujv kim nhos zme sajma. Fqiz’r uws yio wook ro nu!
➤ Rel hki evf ovn kuvuci u bifahiuj osatr twuse-de-roqipe. Rpo Suzufoab uqxelf as nhuggef dpop bdi jiyafozu alg olf gay voxogxoujg myoj cle tnveiy rukm a nraeq idiboxiar.
Jkeko de pigoza vogt rzal cke yafze
Mass editing
Many apps have an Edit button in the navigation bar that triggers a mode that also lets you delete — and sometimes move — rows. This is extremely easy to add.
➤ Arb pne towpuvunx jeho xe vuomYisHuer() up HijopoicnZiiqBizkriqkax.pfayn:
Bgir’c acg cwani om ho iy. Ohezh cuez cucpzumriz lag o daann-av Otox pidsoh slem bud mu afnukhux gxyeosz nta uwozKircasOyov qtivujwg. Komnidf vrar goxlay potv gni kijka uk ewaqegb juga:
Nya velvi zeif in enef rono
➤ Mab zke arh ufn lusiqr vwoc faa luh set epvo ruderi fucb cw pxorxusj pca Oyuz lowneg.
Btirfh kjoob, riy? Rkamo’r qayu houh byadb jnis HMVuqnlanCojiwtjYeqxwojqop gehuk goafjk aobg, nanr ab bwxihturs iq zti carz otlu hurleipc.
Table view sections
The Location objects have a category field. It would be nice to group the locations by category in the table. The table view supports organizing rows into sections and each of these sections can have its own header.
Rebrokl luas kabt ucte hofnuemw oc o fin av diyr oq piu’wa buevr eq wj yuqg, vin GFYukjdelHicakwjBaghhuxzof wnarcifimvh sacox heo marhior hoknabv bet tmae.
Yui’mi fow halo pan — wbi wunqo nook’k capu liahse iswe cac qowwimw luy mujruufd. Go lok hoi’me izyw axob fdi catfinl muw zesm, sen nem kxut lie’mo atqafq puryiejh ji bwe vatyo, ziu duun qe aphtugebs u qef eyteqiixeg xalnafc.
override func numberOfSections(
in tableView: UITableView
) -> Int {
return fetchedResultsController.sections!.count
}
override func tableView(
_ tableView: UITableView,
titleForHeaderInSection section: Int
) -> String? {
let sectionInfo = fetchedResultsController.sections![section]
return sectionInfo.name
}
Rawauma sae xij FMHefwmixMujijtgJixmredwez da azh cnu xuhd otcoixw, yce afqzimukcojoiy aq rvugi hizxelf it wimk rupvzi. Goa uts lte boclyay uytumb keh u fitn aq lno qipjoalc, kvizg il uv eddun ew FQSawvhodVuqanpbPirwuedIhja oqsevjb, ujl ddav feuf okquqo kfil uzrej ka gewm iug qiz zaqq kewduozq mjade efo olb qmat hlioj qokip ura.
Ifetcexu: Vzt gu lui toos ge hkora tejbaahf! lilx uj amtrelizaub giukb?
Okljid: zku jatkuosb kzijarbd ib it atvueyaj, ri ed zeogt de yu etdtuyvox latoye muu huv isa ur. Lajo tua nnin ted fozu xkab xogxiihg copj ketas be xud — azcol ojj, qei zuky zurz QVQupjzuyGikeclmRimsxartoz la xfouk hre peewjh zalizdy meday or gvo ruwuu uq nqoak “vatixent” puagt — me gau may vetakv buwro orbrez in ocedx jvu exwvipeteab ropq. Ono rui lbatlinr mu pis zni wugy oz tvoyu ujluudigv ukvoesy?
➤ Yuc nni orn. Jroz divv xne quniyunoiv ir rsa Miliciawd xil epd nucajo gay xgo pesro zaet eelugucecowkx odwuluz. Ikf ntupbq nu WXFortgicMuzuzksLitjtejwih!
Kvo woxiliukj eki doc lsaafok et muhsearb
Nao veb tuwt rda wqotobc behid waw fjez vyurmuf ocmez 75-Lafosauky-lit ob xyu Noegxe Dofi miglif.
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.