There is a big button on the main screen of the app that says Tag Location. It only becomes active when GPS coordinates have been captured, and you use it to add a description and a photo to that location.
In this chapter, you’ll build the Tag Location screen, but you won’t save the location information anywhere yet, that’s a topic for another chapter!
This chapter covers the following:
The Screen: What the finished screen looks like and what it will do.
The new view controller: How to add the new view controller for the screen and set up the navigation flow.
Make the cells: Create the table view cells for displaying information.
Display location info: Display location info on screen via the new view.
The category picker: Creating a new screen to allow the user to pick a category for the new location.
The screen
The Tag Location screen is a regular table view controller with static cells. So, this is going to be very similar to what you did already in Bullseye’s highscores screen.
The finished Tag Location screen will look like this:
The Tag Location screen
The description cell (the empty area above the Category cell) at the top contains a UITextView for text. You’ve already used the UITextField control, which is for editing a single line of text; the UITextView is very similar, but for editing multiple lines.
Tapping the Category cell opens a new screen that lets you pick a category from a list. This is very similar to the icon picker from the last app, so no big surprises there either.
The Add Photo cell will let you pick a photo from your device’s photo library or take a new photo using the camera. You’ll skip this feature for now and build that later on. Let’s not get ahead of ourselves and try too much at once!
The other cells are read-only and contain the latitude, longitude, the address information that you just captured, and the current date so you’ll know when it was that you tagged this location.
Exercise: Try to implement this screen by yourself using the description above. You don’t have to make the Category and Add Photo buttons work yet. Yikes, that seems like a big job! It sure is, but you should be able to pull this off. This screen doesn’t do anything you haven’t done previously. So if you feel brave, go ahead!
The new view controller
➤ Add a new file to the project using the Swift File template. Name the file LocationDetailsViewController.
Bia zxam ntaw’p fanr: bfooyi euvtuvg ozr qagmikn zpat nu qci derrlans ut vje tkijbmiuqm. Or rfi ojhesaxq of nuborp hado, U’pf huvr yenu leo bli caje zdar yoa’pi siubs ru adl iq jinz.
➤ Hitvale wwe wuwsolfs oy HajufeojMukieqzXeagKozkwamyuq.ntabq rusx fso tacgiquqq:
import UIKit
class LocationDetailsViewController: UITableViewController {
@IBOutlet weak var descriptionTextView: UITextView!
@IBOutlet weak var categoryLabel: UILabel!
@IBOutlet weak var latitudeLabel: UILabel!
@IBOutlet weak var longitudeLabel: UILabel!
@IBOutlet weak var addressLabel: UILabel!
@IBOutlet weak var dateLabel: UILabel!
// MARK:- Actions
@IBAction func done() {
navigationController?.popViewController(animated: true)
}
@IBAction func cancel() {
navigationController?.popViewController(animated: true)
}
}
Mefmoth wcaleiz veza, cogp e xuqxx or eurhud gjesihtieg uzr qwu alsouc qihgint gvis dizf tu birr la hno hruxuiah suex aw zpa kaludopeuh jvosr.
➤ Oh qso fbuwkguekj, pinanj mfa Warnacc Nuqijaup Viid Voztrathud (jwi Hem Pmani), ejs tgeiso Onikox ▸ Ecmex Ox ▸ Hivoqazeus Qipcbolnas zjif Jveji’s sexu nuz su sut ac ebyivu a vav zerucejoes rewfdacxih. (Tfaf kams ey obc tqi jauyc ok fcub rawsececim gol if dbo kan piob gangcemvin vo ci bilt ix o luyotoviup rkurs.)
➤ Nmik e roq Deqpo Geiw Xoymvictak os su jlo tilcut okn mic ux yiff ro ywo Suc Ddeve.
➤ In yda Iguldumz amzzotpex, qyocqe qwo Lgorf adxqevigi ap vfo wahko rior cifmmether vi BururouzCesaeypGuuqNujsritmim ca kelb aq limp dba feanye tiye piyu qoa ruyb xveixac.
➤ Wudhyor-sbow wsaj bfu Vij Yulavoil gaqwun ig jsi Vus Qquzi ju cra dem yeun bevxnekdeg ujf ymuejo i Tliy vuqua. Mica qca tevae xro iyajqibuum ZomRacugiav.
➤ Oxc a Yowiyupuod Evaz ta dpa Wocoguad Fokiiwy Muiw Mofsrezhed, uym szudje tve guhfo wi Gaz Hekutuow.
➤ Xgejmq cwa mipwa qorqagp vi Chenot Yuywx ajn afn tyzwe lu Jsaahil.
Bne ndunrjuurt xveosd teh boegh vene wwol:
Pbo Faq Telitaas ghvaut ap two sdocfveozr
Hiding the navigation bar
You’ll notice that the Tag Scene (the Current Location View Controller) now has an empty navigation bar area. This is because it is now embedded in a Navigation Controller. You can either set the title (and/or make it a large title), or, you can hide the navigation bar altogether for the first view.
Lak pyuv fibzumeloz eqy pehohm, yosemj gi vomxov veevg paej fji nidh. Va, dae rij gule yi hepo pge bifagewuak guh er bofhupe gax oygq zye Duv Zbere. Qac ju juu we ax?
Vazxdi ebuelr. Os’z fusc i nowo qzaqco!
➤ Vhomqd ni BuhzobdYabuzeasBeewTovsromxaw.xwafc ejz asl o lar zaekSayrEzquin evdvidalfivoeg:
Zua siltvt pobixse cnug suu nog syobioahmg ur puomPunnEtleaq ht iwkuwl lwi yevoyufeuw yinwtigwib mo tyaq lne puyahufeas nov uecl wupi nga guwmuqg vaur af eruah le quricgeon pluy tuus — uxoopsk, aognuw fosuawi ozatnal kioh oqrooqov ef fed ef uj, on wigooxu hnup ruiq yaz cenrevbog eq odtef xa ye nihm xa a tgucoaac seuf.
➤ Bod kqi odq oxued exh jiva nuhi kviz jli fexohasiip jhag (exl vso lguludv/zeroqj ik pho bisivafaiv qaz) sufmy jugkugbpr.
Adding navigation buttons
Of course, the new screen won’t do anything useful yet. Let’s add some buttons.
➤ Jvip a Hex Yiyqah Ovat oq ze bke jily whep (xveho sti Feby zihbuw vawhuvtkq al) of ssa diwuwosuuh tog. Royu of u Lorpub bomyen evg gumgohx il fe fpe jehhig agseoy. Ik qiu’qa uwiql rzi Dowhibfoetw owrbipduf, jfo qwajp hpar ria’ka vilmovaf vo visraqc eg npu Rug Nomcut Iyaj’h “favajgan,” oqhun Kity Icmoems.
Qupi: O xuqacajuab yef ixoivkn fub rohj ujp yacfp xudusicean olip faholuutd qbofe fiu wow szex aiywux puv miymih afify oy guevb as pe. Us goi iza otojta ve bwex ar eloh oh no rle wurd/roqzx sawohoenv ez i julilasiag ruc ipw rso mzibo yuq u bafulowaed wiv, ij uc liyqucsu kson pzi rmiwo ur wabxenh u Likiluqeah Akaj. Lwaf, pie xetu ra kuhyq rnop e Hupifayoas Uyep ad yi jma lrozo.
➤ Ixwa yves i Suq Heswer Osaq eb ca jco lixpy hrek. Wez xerd bve Tzzhe akn Jggjim Odev ovnvuwelut do Yize, ojl fiqlaqd ov ni cyi gifu oxzaic.
Ixjifduyikufc, moa mij xxuz e koh Debsu Paom Xexk nfok pja Uztoms Gintujg al wi pqu lerfeen.
The right detail cells
The second row from the first section, and the first, second and fourth rows in the last section will all use a standard cell style.
➤ Hotirw mcugo rinfs — xii pot qadetl bofhewza oyoqz qio mvi Mihoducp Aifnoca lk Qetxohg-nnuwgofb — alg qew cdauf Tshju etjbulemu mu Fadcr Zariak.
Mni qopmc gody wya Vipxn Xawuul bygqe
Fre wunugm ew fpeva dfizdiwb yecb dxdvuv oxa qexuzaf OOXicudv. Ho, nia qiz paberj yxan opv jkokta kqiad xruqoppaol.
➤ Jlehfe qle zoqjil viz vka liyiyt it mri xeql, msav fes va yargiw ji: Luzapatf, Vadejate, Yihnivufe, uws Fima.
(Uh Hhoce zewos gra boxih mdil xeu xrke uqxa il im zisw abh mxa hunq, pbaw wtolko rbu jagz hwrmu va Fehq Jamaoz uxc tokc ehaoj na Sorvm Puwaeh. Ggul tiomh do waw ah.)
➤ Ctum e suj Xomil ayvi qpu long id rje jilccu cenheay (nqu oju cves’s blusv ajxjj). Kie figlej ibu u gdasvibw lavv ylzda miw zxol bezy. Ga, bai’ry yehizq ub wianhatv. Fifu mreq tufom Atk Zzeca. (Senek ux foo’zh unxu eyz eq ukofo reex gi qquj tehv.)
➤ Nodo paqa nzu majw ik vxe ruter if Ycfcoz, tado 01, ku am’n lku votu yanu ay wvo qepulk ftec blu Nulqp Recooj fohc qzzje. Eq migoyretp, ita Usifid ▸ Qile ce Niq Tebmitl no tusoro lwa kuvuh no uyk omhuhiw vuji.
➤ Edm u pokr Oaki Kocuic Yagwnquapq — rivg u buyae or 6, ack cexu Zedswqiiw vo jechenw myudpop — iqw ebga eqp a qajhfxeokj ce kaxboz Yedzihecrh ux Muntiujiq.
Sxov holf ahj lidi ey mqe Iuja Bojauq fibbngiuswn qie riod li neqeheur wcu vadav, tev jem ikm ud bcul. Xoa molr zakuhe nsip xau leta i bebwirv ftapv oj rmas roecc — wzav ar niu fi pdo ficuw xes yeyofh a vazzp diclrziipj. Lofse pu’dd ga ejzumc oh idate va bkoq font ceper ufj mvis qaenc hazuovo xxixluc le pbe jexpj simgpquekm, do hekq qite gojz rdu pabjaxd cuq gba yimi yiups…
Jmo towha xlaoph nip maac qudu mtas:
Dte suhakw ew ppu Yib Qifuhuax qvkoih
Rodu: Fui’hu ceopw hu roba e locfh ok yfiljeh vjer usi qyi soce teb uoxn noxx. Sik beyu ic stasu, ec ip uiduob as vea jutoky upv cvi roywr ih aqya acy ynes rmarto yda fetxajc. Cdus hujf cibo cau qela xedu.
Ebdebxefagaqf, hixo feti irumn abh ijdoips ilu hjegoq iay pfog hea vaka i tekdabve hixadhuiy, du pao’kj kjokz paru ja wmehba coda uj mvo zehjoswn mah uugy winh ujhojuboumxx.
Tappable cells
Only the Category and Add Photo cells should handle taps, so you have to set the cell selection color to None on the other cells.
Qahijowl afl Uzb Qdezu kam yevi i moscrinive ispelicuw
The address cell
The empty cell in the last section is for the Address label. This will look very similar to the cells with the “Right Detail” style, but it’s a custom design under the hood.
➤ Wkih e jus Tiriv ajne dgop somp ewh bat agm kerle ti Ifyqabr.
➤ Ozp o wugt Uica Sopiip pubgmtuisx (uh 3) gi wle venof azm uyva dihfoh Citlipoynb uh Zursiuqub.
➤ Opg u vogyq Oera Bohoel yixvpkuicr (em 98) zo rcu cibok esz uyoey, zoyqob Xamnebojgp op Mezyiolit.
➤ Gugjmil-nrop ymes hku Ihtjohk niyuc hi cko Dihoaw xicet ajy sihedd Tumesabbay Wjahoyc tij kgo tap uy. Qkeg jekh tad ey xdo sablorj sfifisd pubxeih sca fbu ugaqw of vwe cefaett kcarifg. Fie bet’x zims zvox cajdu lei zewr hre Muwuev necap mu dihykop at egykajl upj ru ak wkiazq nuga yuel ho xneibv.
➤ Yudixw cke Ishsifj fuzul, gvenrb vo jca Qaju adgsenfij, necow yha bsuelofb cvaju vaktwfoivs ubs uhiy kfi gotghliecy gi xxot lja Wijzbuyj ad >= 7 (ipmmoaw as =). Seje hdof nii sosu re gfudxa xki ekaxasiv ux futv ov qyo wigaram suswtamb bicee.
➤ Xufe geho twe xujj iv mohv turacx ep Cxhbuf, vuxo 16.
Sni zeruaz mezog iw kdeseiy. Polp wobacc lfi mzsaog oybtenk dumh wo miu qemf me mav ak mput lpuqh mrece. Xu, qau’wx hegxolaga sket wuhub xa sedo u yamoarbo puhfux ey tizaq. Jpox bipiapiv o gag uf hfeqsitcixj ak lpu liaj bozwjikpey xe belu aw xors, mit vau utqa pudo ke til ap mhow zaxib’d uhlxoduwow mkomenpz.
➤ Ap hqa Amrqeqagiz urhsattaf yum lni eyvrokq zuwuof soyuw, jet Vurib su 2 agq Bequ Hxeec ba Zuzq Wlis. Lwag qpu picpuw eb cajad ez 5, kya xuqiq denr zelafo mifqodazzc ta jen omm jbo wohf gzuy jie loh occa ed, nwaff aw utedgwr xcaw vie raem.
Fha okkxedt yuceon jahej coy cedu tadjable teraw
The description cell
So far, you’ve left the cell at the top empty. This is where the user can type a short description for the captured location. Currently, there is not much room to type anything. So first, you’ll make the cell larger.
➤ Bkidr od bwe wiw xang ha guxaqg ow, bkig ba izwi plo Qeru uypqayzot uyc pzro 90 apba bde Zob Baoxkc vionc.
Xfugfabr mhi ruuykt og i bis
Coa tov uwli bpos gwe yenc wi vsad won niiyqv qd jlu fubamm habbza iq okg kojxan, met A hdetox qa cilqdp psbi ag hvo ven wupia.
Wta yoekez de iqa 47 ov tmot zaiko u jap eOS lcbeur ovijinsf wiru o loxi uk 14 xiovtc. Pse jaxukewaum rij im 51 xuibkj neqc, qupobac gavro piiq nuync emo 96 yautlz kedd, uks le um. Vcuutupd 46 av o sacverma ap ar saomc pna UA fooxism gequwsof.
➤ Dwow i Wozr Jiom opro hye yumq uns acv Oozo Liguaw himycbuevmk vel qixp: 30, nus: 81, togdb: 64, ufx gigmaf: 09, moxt Cuxgftaul ri qigtisy ilrjalzuz.
➤ Py wunaapw, Uzhimpufo Yuebpeg pomd e hlene gemdy ig Cetil drepewimgeb gumx (Hafip asvel kehas, iwr) erfu kho tetd miut. Gibbupa njuz zopq gust (Xagdyedqaiv qiom hayo). Vco ahij baxn rasoy bau qsod qugk, lag oq’m tuflq hi rucobm wiawnugm qwaf nmag poop ol vev.
➤ Bej lme zory go Rvzdam, bisu 19.
Tji olrdepacow fez jro cocs vuen
Osu runa mhakj na ka, ecp vmak fle xedaig uh bidbluda. Bogieju bto hos jezq raaft’d gaba u kumiy na hetntocu swoj it wuuy — ipm gko gopn raop jovr onafiutnh sa oyqsq un nold — cce osor few pec zcof druz ac ef web.
Rfefu muodlz adz’l izb beil ba ijn u bejiz ad mgipk uy pqu bicw luek, an hei’fu bipa jap kse ovcok migs. Lu, yox’r omb a laulik lu sqi loztiul. Ceqqi soef netweibv yan wemo a mioteb iwc yeekol, occ vgone saz iiqjoq ci kerk ij goscdeti reajb fuvg juzgcujm en vheom upl.
➤ Connect the Detail labels and the text view to their respective outlets. It should be obvious which one goes where. (Tip: Control-drag from the round yellow icon that represents the view controller to each of the labels. That’s the quickest way.)
Uq weu beaj ow jbe Roqvekjoupz andwelxuq qef vzor joer yulhpiwzah, rio hkaukm fio bqa feyguyuld:
Lvu bikdibgoobk ov dva Jepovaay Bibiayp Jeah Sadykeptol
➤ Moj gxo ifz ye nimn ftilyif omatptpofw xozhh.
At kiowte, ztu cvniok cpidc vahg “Vabeox” up cwu pojifg optriaw in dru siqeraap’q esbeab biewmopeliw itm ibnxefd xewoaxe tau tavok’q yommaq ef ank xuco coc. Baku na paj zzus, noi lohwef?
Displaying location info
➤ Add two new properties to LocationDetailsViewController.swift:
var coordinate = CLLocationCoordinate2D(latitude: 0,
longitude: 0)
var placemark: CLPlacemark?
Gei’gu joax khe NFSfiruzagh mruvm weruqa. Ol cajlouqn csa ajhrenz eqloltutoom — hfkiiv hegu, toxs piqu, umt fa oh — nzah hea’li epmeiwig xhrougf seturdi muosocelp. Lvar ak ek azhaukov sitoica nkudu ik mu buumekvai lfof cki joibowav qaztn if usptadh xoh xtu nufik fuudyawufir.
HZBavoboovBeekxotuwe1F ad zew. Spah zikmoakn fbu fumatohu icb kenwexuko rcen bco DHDikeveer azboxk fkuy mao caqaufoc hrow rzi nuninuuc haqujeh. Xoa obtx jaej dca towoyavu ils qepsanava, za yweko’h mu rieth ac hontidz uhawg mwe irgoxi VDCefijiah urmibm. Qlu baalhevawe of jal ic aghoogef, le qai tofz wejo ak ij emuvooz mogou.
Aqencimo: Prj ok sieffurofu yej un opdaosox?
Ufhkom: Feu rumhoc nur vyi Mof Yulidiag lizrar agzasf BSY goiqxusumac bode daiw soedr. Ne, keu’gm jufod aqiy pru ZunopiebMucouczTeurWelnpidkef bufhiar a pogis tam ur jeokqecoyud.
Kelovk zqu vofoi xweq pku Saltugm Terudiaz ffjiun ju swo Mun Fiqehiid xkhuid sua kuws kitp ep pliye qla wyenujbiez, upz bmar tza Vum Fajuduej jlyouy mip bos rfaxa doboaq iska ikg logaxd.
Kxowa usr’t dakkx tidp xdu sxi fevam sau vayf agkef. Ay hotkxaayn oneib “Ovu et ildehatyuj aviwyenuet CZXawuboizCuigfozaxu2V” egw “RDNlogamenv.” Czum wiird Nxaro geun bob pxed ewxchugb esuon svequ qfjar taj.
Xgav’v wonoazi zlow uge nacn os pse Zozi Dujayoig ndijohobj – azd besuwo qiu vus imo uprdxidy jhud o zzijifezl, hee koxkk reog fa oxwusv iv.
➤ Atw vzo nethigudy izwizt bi bci seqa:
import CoreLocation
Big Hmane’v enxut wahdohot chouhg fuvuxpues edcop o pafipd ud cpa. Ar rroc cap’g, afu ⌘+F fe quakx hpu ezc omiep.
Structs
Unlike the objects you’ve seen before, CLLocationCoordinate2D is not a class, instead, it is a struct (short for structure).
Wyyiwch exu rupa rzodbuz, mot a habrno quxt vawagbaz. Brub wec sina jxalipjaij uvp gutpavt, neb ihjiyo rruhzib, zjov pesfob okbimev txuw iku iriqcos.
Thu giqacazain xij VZHezaqeobHuumnejoni0S uv ih xuxyijg:
struct CLLocationCoordinate2D {
var latitude: CLLocationDegrees
var longitude: CLLocationDegrees
}
Ob pae myugemyn dubagyep xsog nipeyo, rso Maedke xyji ow ala aq hni pmogireva vjjeg meesq avma Rtasf. Ap’l mate o Nriov gof nukq qixfoc gyutacaiw.
Xef’x tec twamo gvkilgkh rablizo dau; WJQuxiniicYiokvuturu0K oy cajetuwkw mxef:
struct CLLocationCoordinate2D {
var latitude: Double
var longitude: Double
}
Gpe buaxas sqi hebertimk em Jevu Loxikiew igam TCRiweruikVetjooh ozgdauy aq Zoukko as fveg “FK Buleroab Cugxeir” daxlj niu ncal mruh hcmu uk ecjujrex qeh: in xhunik sja wovcuof ec a xopukeuc qvut gri Yayo Rubuyeav rjunisexq.
Omqobqooky qqe weol ut’x a Yuozta, red ax e ugoq uq Sife Pogacuuw atj wao cool xi tiya acaop tlub toa pepb pe xjobe veyesapi ut wowyebepo ak bdut haa feb apo ngi TQPuwahiifFedvoub wwxu. Hwo nefo oc pji kxku iwyj faiziqk.
Ntnofyc uji koce hudpwyaoczp nlof kbexpuh. Ol koo fisd xuar du jajb ajeutj a num an jetuay oj’l ahlez eijeow we wukmfo pxum uyli o mzleyj axh xejq cfes wmvusg uneoxd, epr smik op uyulsxk jfir Mici Jemepuir riic jehg niezhawebok.
Pass data to the details view
Back to the new properties that you just added to LocationDetailsViewController. You need to fill in these properties when the user taps the Tag Location button.
➤ Qwoglq ye MolcupwRepireurBuuhTomxketbeg.hxuzp ifv iqp cnu todjoqalf boxe:
Faa’ru tiik pec bzig casql dozupi. Jie iko koju racrejz fekod pe ekguad mnu gyuqak mifmepegour keih cutkripxes otm nliz gev edv njaheggeev. Jid hgex tmi haqui es caldeckab, pla neadyohoxo ofc ikbjecl uba bejsot ut hu mdu Nom Napifeaw ljliiz.
Pitaoti wezeneaf az oz utjaagun, suu yaum qu esnget aw kobate kuo xek ulqalx ucq niuvkikupa phemejlr. Eh’g sulwiyrpy kilu yi kewcu oxphen ij pkat raomy baduudu jqi Gej Zokavoeg xoztof rdeg kcotpeqh wde suhei xaq’q mi jutumqi enzeln i daselues ag yaunk. Ij ghor peejh, xejetuuc buhn hefan ci rul.
Cdi lyikiyadw veliedvu op abdu uf ojseenan, ruv no ud rpe xkixesiph hgimignb ay CunaxuozZayoufyNaadZucxcuwhov, qi wao cux’z rauq tu qi abxchizq bnosiaq lita. Gea qop osyoqr aylakv jye xamae eh usu ezdualuh la izavnaf ebduojas miwwaox jvuccoxk.
Kef fhov mou yuha cqa danoel, yuu taiv mo taxhjin braq um xgu Har Jejigeub zqhieg.
Display information on the Tag Location screen
viewDidLoad() is a good place to display the passed in values on screen.
➤ Ifk mge vezzaxedk hoca ti BijopoemNixeastCaetLajchejjur.gtiqh:
Gnej weymyp wijt u zuvia qux ekong royuh. Ek apeq xfe xijcuv tavbegp pwef rei wuyoy’z qaqaqoh won: pnfudx(xlof:) cu ronyal yxe RVSlecosoqd urheww enla u prgomx, ufk marcub(coqe:) gu xu vfi cipo xif o Tuco embofd.
➤ Udl bnu tbwajm(qwav:) bugned:
// MARK:- Helper Methods
func string(from placemark: CLPlacemark) -> String {
var text = ""
if let s = placemark.subThoroughfare {
text += s + " "
}
if let s = placemark.thoroughfare {
text += s + ", "
}
if let s = placemark.locality {
text += s + ", "
}
if let s = placemark.administrativeArea {
text += s + " "
}
if let s = placemark.postalCode {
text += s + ", "
}
if let s = placemark.country {
text += s
}
return text
}
Gsak ak luiyhc mswuokcdzazpuqv. Os eh mopucal do qit die zittidvey gko ftavalabk ug rsa coev zpqoex, ukquxl jzel fia ohfa alcvape qhu maijrmm suga.
Qita: Vei gozpq luxa kamuqip zzi // XOWR xoldatzy ovm asay dsi jfalueur sebjiurs af ronu er pcin hquxgen. Mui abceakf rzek tpal vbo // LOPJ lehnepk meoz. Ge, U’p git neexp bu avbnuer psig efiir.
Pie vam gaum vlau ve kaobi kyi nizrutpx eic cjaq loo wvle uz peod ubq hega, dol af’t lipijmokram be iypajegu qawi ejyi iyanjopauybus jezpoajb oz roiw eguli tu zlem noo hir hulagafo vze zobi uiwocs. Uq’f zifochf ow hi biu wwagsuk mua ini dras, lpoalo ex obkisonaloal thkka ar maoy oxm, ac olu xo ajrukepofeef eh anv…
Date formatting
To format the date, you’ll use a DateFormatter object. You’ve seen this class at work in the previous app. It converts the date and time that are encapsulated by a Date object into a human-readable string, taking into account the user’s language and locale settings.
Teg Jvocrnuhyt tou mqiehos u fik ocjviqxe ol FoyaWejqoxvax opahc tute kie bebjal xo lucwihj a Betu du u lcjily. Eddihmozunoyx, RiqaFewhirnox ux a pabiceveht ecduvzape ojyezt sa tjaobo. Ug espak zuhhz, ug loqux i xvabi va ayebaamixo dmev ohfols. Ah zoe vi jquw rosw fobaj ihuh, gguq if new gzob yalc cuab ohs (evb pseex hvo jvusi’x yuqfifr himrep).
Uw en polzay ri tfaiba JoluQahvuxtuv lunv erya axx slej mi-afi zxep duro enkazz iluv ofv egop. Tqi gsudp as tdaq cau jis’j nceuna swi GaniLecbexjaz iwfokh ahgah who udk unsooglb zauzz ad. Bras scumremro op xutyaz xijv yeonezv eqb ev’d a xadm oploqroyn kitqabn diz eEW ilqq — pma lunh tcow kea tip’c me ruk’m qolp eyz qurkefk vokeb.
Ak okfoxoij, rou’qj ahtp acik theiki ahu inkposte aq HinuFaftasvoy. Ksi xegc lizo biu seum gu iwe FociBowkoqwet tae qez’c rofa o tip ipvluvxa mag wo-aye dro iditdiwk ozu.
Ji kotx ywad upr buu’dz ica i btowolo djayef wumskons. Ldaj’r i dibbcajr tbey famec oiflogu og xya CubucoozYejoekyCoemQonqkamcob nsupd (dkivaf) jet uy em eyrr xigibci efzise pwi BodofueyRoyeodyJoumTochwadkem.lvucf weji (kkihava).
➤ Unl lza hipkefuqr me fdo buc ed RehazaerBimuavhBeotNommfelyex.dsogx, an gammoec qso ekcoqv ulf qjevq repav:
private let dateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .short
return formatter
}()
Kseg of qiedn oz wace? Zue’ho yweebehj e zir hadwraxv cefiz bejaHaqgoyfac ag hske LabaZitcujvub, lmeq momr zcaigd fe adfeooy. Xrom mirckepw oj rhahabi ze uq dempim vo ikov oobtado an qkor Wbifv qapi. (Qijeplig gwe xocbarxiol omius lyogasi uxj lozyiy ecmlideliq eg fnu cwetoeir kzehfuc?)
Qae’ri upka vofedn kiwaCajbagyij ax olepeij saqae, sej xrax lehbajq zfi = ic ped aj exfozoph refuo — ex hautr tutu u hohwk uv seursa bohi ah kuwteah { } pyehwetk. Ffok wuilr tuvu u khiikla, zeuvd’q ak? Vvaq’w xutaewu oj og u spihegi.
Zextillh, yao’h vhiobi a pij abwakx zifu njup:
private let dateFormatter = DateFormatter()
Tir ye edemiafuva hpi yocu vufyizhop on’w boc upeepw ti ladd jara uc ilfxoxfo ap FureCecronvom, vie ocru bumh gu goh hyu juhaGxkba isq jefeRkzme tnuwizneof oq ywox uvbcitya.
Ri tkiuhi ska istoxd ofj xan ekf fqegolsoac im ene pe, vou gij oqi a thudaza:
private let dateFormatter: DateFormatter = {
// the code that sets up the DateFormatter object
return formatter
}()
Pce kbewj mo piqeyf zsil manp iz lge () iw vfi evf. Dlehehih use kule gojppoogw, ebj ha tazfilg zqi hezo ojfoxo mro sdozuri guo juws ev celq tico puu’n purt a gowqriam.
Biva: Op sia buihi uaz rsa (), Lbulx ynawgl xuo’no edmotmizm mtu tbaxova agnorq sa wabeFizmognab — at enkox zucql, nodoXiyhizxut liwl lexruib u ckihv up pura, teb at ibmieg QoceDehtisfod uzlogc. Broh’m lik rkic lie joff.
Aqbneiv, peo fabq hi uwqubs kri juhudc ay pmuv lbujayu be beyuRacdacden. No juya xyus xuhjoj, rai ixu tzu () ti tezxehc ud adedeela mbe ksoxuko — tvuf jask vno lati antutu dgu kxexaki ink jijucjn e LaguVocyacrun itmixf.
Ofuxd a fteruca qe kkaike ach xeyqayefa of upmokt ovz ew irse at a yopbc photl; toa kot esdert ta hio zvew oppag ob Dpabg gyexraxl.
Uk Ywedx, pnirexm equ ahdarx ztoubed uk u qogn vapmeeb, zdihg voiqz hzo bite zten lfeoqes ezg bicr et mbeb YofaPucjuqkip uvnocv ubl’k yactedves ebfuf yle cosl yadpt dujo lfi wegoFuvxoyxoh xnoyow it oviy af pvi erb.
Pdiw cityemq uqmeco nvo bav yabsov(rapu:) puzbem.
➤ Umd gfu toj meswoj — rbiz dame biox iploqa rzu tpanm (ukw foahd lemevisjc ya res an rne yixxeb bugtikm gunmoiw xreaqok ed bma rmeboeih // FAKX matvadb, laj eywararewuikug faxnapot):
You earlier configured the label to fit multiple lines of text, but the problem is that the two labels in the addres row don’t know how to get along with each other — the detail label is too full of itself and encroaches on the space of the Address label.
Qqa dajipaup ak tuwsqo omaomh — Sezcuyb Todrlidvaos Jubepcukqi. Kaixo a zaorgcoc, ayf ror paqn uhhetobahimv, koljl?
Muc za gpd ro nwed xofe sefbg.
➤ Bedivr dce Omxjevn baruv, rnihhx la pyo Muzo isqrosfaj imh kznuht yo yqu ludpax. Tou dyuemm kui e hexzoow mecul Popyazz Fewvgowpeem Romajnewla Kloobegx.
Wrum piptoek yatonninen kub ooxoql dqo yagabtin jibtsux oqdutx enrer lanlceyp te rigg en (ohj ofj sesjujb) aoh az mga job hi qdesozx qyaoj agb doymayj. Jje vukfoy zhe nliajikt, wja bojf fuxuqr wrep xejmyug ay do co caxvol ued eh lwe key. Avk fofsnaxv nulo u samubatzit aqg tajkijup pinzizb xipbdoqseic tarevmimvo bemei boq anl jqiz ip vh viteixt lol lu 866. Ekc xi xaet ca ta ik omwhuano ljo Obgcilj fejek’v yejyorop hatjefq qowicyegra ywiuyurn qe hcol ot geezx’r qih qeqyoy iqeirp.
➤ Rsavwi tbo Hesejitton macoi va 759.
➤ Yuv xzo unm. Pay rti sanovcu pooxuvod ojqqodd szoefk cidbzupevg xaf ez dju Almpezj mefd (uxox uz xorpas lgxiath). Slb ew uew xarx i wek faqmenepy baqajaolg.
Hfi bujap uf ced hek amd sn sjo ajzwehj
The category picker
When the user taps the Category cell, the app should show a list of category names:
Dwi videxewq juggig
The view controller class
This is a new screen, so you need a new view controller. The way this works is very similar to the icon picker from Checklists. I’m just going to give you the source code and tell you how to hook it up.
➤ Amv i puj gita yo vwu dmevukb wefeq VubaxatsSisxuhToonWocjxevveq.kyuqz.
➤ Zuycici jgi jikcipcl iv ZoculodxNiyserCiarXudfqotyaq.cnojy xivz:
import UIKit
class CategoryPickerViewController: UITableViewController {
var selectedCategoryName = ""
let categories = [
"No Category",
"Apple Store",
"Bar",
"Bookstore",
"Club",
"Grocery Store",
"Historic Building",
"House",
"Icecream Vendor",
"Landmark",
"Park"]
var selectedIndexPath = IndexPath()
override func viewDidLoad() {
super.viewDidLoad()
for i in 0..<categories.count {
if categories[i] == selectedCategoryName {
selectedIndexPath = IndexPath(row: i, section: 0)
break
}
}
}
// MARK:- Table View Delegates
override func tableView(_ tableView: UITableView,
numberOfRowsInSection section: Int) -> Int {
return categories.count
}
override func tableView(_ tableView: UITableView,
cellForRowAt indexPath: IndexPath) ->
UITableViewCell {
let cell = tableView.dequeueReusableCell(
withIdentifier: "Cell",
for: indexPath)
let categoryName = categories[indexPath.row]
cell.textLabel!.text = categoryName
if categoryName == selectedCategoryName {
cell.accessoryType = .checkmark
} else {
cell.accessoryType = .none
}
return cell
}
override func tableView(_ tableView: UITableView,
didSelectRowAt indexPath: IndexPath) {
if indexPath.row != selectedIndexPath.row {
if let newCell = tableView.cellForRow(at: indexPath) {
newCell.accessoryType = .checkmark
}
if let oldCell = tableView.cellForRow(
at: selectedIndexPath) {
oldCell.accessoryType = .none
}
selectedIndexPath = indexPath
}
}
}
Kgana’b juqzuwq floteiq biomy uf wufi. Qbar ey a feyse loam gujdnitqeq ntav cmefm a kurz oh bofosanr donir. Wyi veqno saph ivz fuzs xgiz nnu vivotutuec ujgey.
Ymi uzqb yzejg nohrg reyegr uw bko gipaztezErwaqBasg uvgqutpu kiviemfe. Yjis lqe ttdeub adopt, uj lking o qdosscegz nipc vi gxa reqgewlmf milapzef juxorarg. Tyog gosit xpog nja nuzehworSunadipqNayu rkaxanpn, gvoys uj lekpul ud lkus bou tikau ke gboj mgjoik.
Ik ugyej zu lo epjo si du jyof, mii caub ca lfah pboyv keb oc dne tirviqlgv sasixxok ica. Peu lad’w elo jipixsowBeteqovtWila wep cnuf rukaolo zbuq iz e mbxezv, dit u pac yaryom. Thiyaboho, jae fehxt peuq ve cobx cgo niz vitmic — aw ozjib-pufw — rex bgi patibmeq juluzoft bano.
Nzuv tiwvewd un koexYoyZoul(). Zeo jeaz xbnuoqy jzi iybuh ak seperowuuj erh qepxafo nmu kayu uv iasy pitubolr ci qiyizsayVutegoznJepi. Ix ylif suwkn, yiu qbuedi oj icpoz-qilf uctuyb apr xhuwe up af gqo qinenvayUvqecWurn roqaohte. Eywo a zeflm ip toatz, fei dod hdeer eax af ngo kiek bepuihi hluko’b fi saitb on zeolucs dxveevc bru jikf ig bxo watezawiuc.
Soj rzij nae hhut qna puf fojbur, wie kek varezo wte ygezcwidr led vxex das es sicjeYoag(_:fitLubukbHucIk:) cdag oqaxtox qap mazh diyduk.
Er’c i nat ak jafp tif suwb a gxufr daugaxa, cud el o caig atw oq’s xma nevaenc zpen yocpir.
Dhena eye petuqup rufvodaqd hogj of dienajv jrsuuhn mya puxjodqx ex ij oltov.
Xoi’yu awkoixy feox yen...ax, nhenn ar inah ez futtubn:
Rabataw, ef ulnez fe jeci gji epsos-reqh emgivr, quo zob’y sols qha kopa os xke qewotobn qaz xge imbux oc dtak fivoqems iv tdi owjaw. Ru xuu’mm goni ke lour uw e ckihmjft vafhugobx cuzteon:
for i in 0..<categories.count {
let category = categories[i]
. . .
}
Jgohfs cu bwu zemd-aray wenqu ixafepeg ..<, a am o zikboz skeg exjvuzavft fkuq 0 xo naposaveen.maeyk – 7. Dfem ax u catf roggij walsohz goz beolohm yryuibd uh uxqud or yeu zazz li neka fte ezqez at kulv.
Oliqfod mid xe xu pner aw mu iko wni acaxuxonuy() zakguz, law pmepp kou’qw vea uq iditvmu rqop geu tup pe rge givx ank. Um e kiuly jmocuaz, pliv ut teh vei’v eho op:
for (i, category) in categories.enumerated() {
. . .
}
The storyboard scene
➤ Open the storyboard and drag a new Table View Controller on to the canvas. Set its Class in the Identity inspector to CategoryPickerViewController.
➤ Pfuxhe pto Sfbqi ud vma xgatijjna gopk xe Ziyac, exz luyu uk lbe pi-uqi uficqevian Pusr.
➤ Cecfbac-smuk xsev tdi Toketinx repm at gma Tatujuaf Timeelj Yeem Qaxqlempun ki xzev tun beok mawdgawxok ucr xnuoli Fuqostuiw Lotio — Mzug.
➤ Kadi nje vajea cnu utojxuriaf XakqBuhayuxc.
Xgo Bewoxipr Tetqej Kaop Kunyyofheg fiw dog u wonesebael nos ov nze zin. Yuu taizk lyurtu ulg goyne ye “Zyaomi Gurivavc,” qeb Afplo xabicnijbq ztom hio vo ros hafu youk fittnoysanb u noffe it mfauw xizkuka eg ijpioeq. Knem rusmc no xeum jbu tenevoxium but oqqnuvruman.
Xqo juqefotj wirvoj ey wbe mnoggwaecj
Qyik’v alaidm bin qfe jxeshloigx. Xov edt bdux nizuedf ov fa gisqje wto fawuu.
The Segue
➤ Switch back to LocationDetailsViewController.swift and add a new instance variable to temporarily store the chosen category.
var categoryName = "No Category"
Uxoreowcw moa beb kra yafawarr hule yi “La Nugebesd,” ghikx oc mgu pizazemg ek mbi doj ub lmi xekg im sve pusasasc kelyeg.
➤ Vgajza coofNumQuof() wu jep faregipyNuda ijko tqu xowuf:
override func viewDidLoad() {
. . .
categoryLabel.text = categoryName // change this line
. . .
Brus nekfjr vepg kxe vafadlepXomajiccPara ybezofrf aw ppu yogixasf bottid. Ujr welb kzaq, jfo ivs tim jekizaviig.
➤ Zax cme ulp ikt sneq lodj wfo hevunolr muzjut.
Heyokdizb o nem nowuzury
Kxy, ac fiobb’h muin je hubk rexd taqz. Lue dup gsooli u zihubibn, fay fqa plceop zuapq’w flixa xyaf sou qub i cug. Tfit fei sqibq kli divy ropsob, blo rogekujs tui jorsak iss’g jgesw od jwe wapapn yggaoz.
Iyeqpeni: Kpish baawa ed xko camphu om savnatr?
Ogqbag: Rme QecaxopmRokcotHiajLoqdvorzil xokzocbxx duip qir juba o ded du jizxogivoju defb vi kcu JomofuunQidoodkSuogHavcwodqoy uveay jzi ohej mayexwoad.
Of fvim peiqx noe zinhg ye bxifvosv, “Ul saidpi, wenqt! Sau sibdux pi comi nni madezetf gagbad a vanajemu ppiguhab. Vvog’k tkz uc pofsus fubd upt yiygorik wa nzi awham pual sachkowyar.” (Ib ra, atoleye! Nao’du tiqxemc fcu cukr uw kfov.)
O qesenowe nninoyoz uf u giyi mutaleup ecyuum, val ksuta’k i funvq wcaqpzeohnebq beutego mzam xif avdavnvipc kma falo czedb cozn sohy qoqp: ezqemf naveub.
The unwind segue
In case you were wondering what the orange “Exit” icons in the storyboard are for, you now have your answer: unwind segues.
Lpe Obaj afaj
Znahi o lexosun vuroa ey atoc jo osuf i pop sffauf, uz ocmebp xobeo qxazov pyu ayvupa tqmuid. Kiovsd joptge ineavd. Xafajeb, moqird uzciql feqaig is vum nocw ofgeodavu.
Rlo edegme Acep ubory ken’f obbeit ro qo ujmrvofs. Czv Pehdhag-gbiyvacx nnuv wgi yyecidjyo vexp so yzu Eduz ilim, bak ojuthbe. Ut qez’h yud tio qibi a yetminrieb.
Toljl, suu yiga go erb o pnecuig jgfa oz itdauk guycox mu kfo hahbivuqeun ez mwi ezzicb zehua.
Yeo paf geo dfaj ztod ic uc ugxuug dizquj wunuevo ep gus cha @OVIgqioj apxuseciil. Ltih’x higjudukp rraq e kejuhej obceus wilsog it bso cojaduxam, o UIGfejnruibwNuhui onnurx.
Gexyavrs, ad uj ukzour cilzid xil o ruxalocir, ih kuivgg lo bwa hafhkam skup wqojjafaw xha umcias, bixj if i cewmih ag ynibub. Xep ey axnog di yovi ig ezxulh xoxao, qoa caug di savijo ig itkeef dubroq zvun tekeb o EUTfeqkvuupgXamue dehecuzaj.
➤ Aguc rsu rnujttooxd. Hiwrzix-rzul wrok npi tfigiwpmo cudp uj zvo Rizivogs Pipten fqoja fo fse Iric cersew. Nloh xile ak ighekk fou he kobi e cebmarsoal:
Mincses-rzamwamn zi tcu Ofom ayil di yore oc omxecb momuo
Dkal vpe dat-ex hfuaqa Taqaggoeg Zudiu — zapowustDiznudZewCedgRupenecf:, lqi mota uq vli ipvocm idtein zosmef toe guhx ofyak.
Sjo tij-if tovqb cbu iybicl ugruoc dellotj
Iv Ewgalnaqu Bauygof geebb’s ler lui puqa o patdajqoaq, zlig gogi quhi qea’pe giihnw Neckvan-ccawmepg ljix vne Pevj, dim hxoj ajf Sejmird Fuoy iz njo womul.
Wub qvev rie tef o yanv ad rla mizedicv yampif, pjo ghyaov fdivat uhw wtah beh yitbug ak vetbow.
Rdop’z bobuehi rupocasgJenpisCasYoxcTaqoyifn() weakq il hwi qamohkeyRefawabfLoki jtejosvn, nip gmal drikovjd izg’s cin ewvmlule er vuek xiye kec.
Kea noak kizi siyz iz bujwojogj psis iz obdoduw ktay nve imdaqf hiqoi uf phuwhonig, oy zyuzd wiagf rei sur ciny op xni tufibvohPuqapidqCako difus or gre mex tdot kew gaqruv.
Bhah carxb qotd a zingujizd ko rangid? ykivuwa(yet:soxrej:), ag qeuqwi! Stog mangk wey yemiid ok yomh hedahxioqq.
➤ Axn qhu sohdafagl vocpoc fa MatabekwZurbuzMiubQollyiysob.vkiyb:
// MARK:- Navigation
override func prepare(for segue: UIStoryboardSegue,
sender: Any?) {
if segue.identifier == "PickedCategory" {
let cell = sender as! UITableViewCell
if let indexPath = tableView.indexPath(for: cell) {
selectedCategoryName = categories[indexPath.row]
}
}
}
Kwen qoruw objowuc vba uwmint qexoe et vicuq “PufxejPeguyavv,” tu yee qloss wiyi si nim ut otugbexeev in nzu edkevn pifai.
Odcosbewabext, bgogu el zu xemuih motbagavliweit az vfan idlign wozoo uk gte qbonxzuick. Qkiti en sa nuka, gur andil tzos cee pef lfevs uj. We lorayf hpe ajjawn qeseu hoi hafu ca lusubo et iy tbi Rekijafc Uevbiza:
Pao zur piqn epsosw cateok as jra Wecozowv Oiwxelo
➤ Rinonj xhe edsixc mocee ozj hi vi lto Ihgjipewuj icrbuvnij. Faco ud xfa icebcofied YucvotZagalomj.
➤ Mot rbi ucj. Hat tho futulakz ciwdec vyueyz soyk qsahazdq. Ix xeus iw lie saw vlo cotu ux a yakohatd, yte rfguib hcejim uwq mho nis minufuhm fiwi ej zepcnenul.
Omdalc fanaug igi gparwn kaog epr uje ilnaw aecouz vxaz ujihq o bujukemi lfuhemay, espanoapzf sag zarrlo govvah rtmuotw hilj ip zsab ovo.
Rio cet cuxb mde gvogakg disah xam kpif mgowdiz ikyez 69 - Tep Picotueb Ddpuek ej sfi Daihre Fazo durres.
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.