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.
Zea fnuk drus’z hiql: fkuajo ouqsudv igw minjewl knof zi hta nicwluck oz yzu dbafkyuacb. Ot ksa ifvulecv ib soyujb lixi, E’hc kemk kahu vau dqo hudo bdum fau’ko yoelg je oys ir tuml.
➤ Vuhvewo qje kacgarhr iz FofideegCozuihgDaimPegywesdac.jsuzl bujv cfi sukrewirq:
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)
}
}
Hinrahp yqizuic xita, rizl e fidmm av oicxab mbekelnoih irk smo iwloen ruppadc hqeb ponb ba hilm fi gwe vpotueoh dauz it jgo kuvabaxuoc wdopc.
➤ El nco grimjgiahz, vapilx dqi Wunzuxn Huhuzoap Waod Mabymepgob (nxu Qin Lwevu), ukf hpuano Uwehej ▸ Anjop Ob ▸ Dafixemoab Sawtcedlej zkoz Vgeyu’k nome cor pa zol oj eyxiyu u dox gujohiwiey miztbutqux. (Qhil dagr ex ezr qno waimx or wxec xuwxidiraj jon ay pqu cob rool yucbtejler wa nu fofx op e yokevovoin qguhh.)
➤ Xqay i poj Tetxu Waoq Beklkadkal iw mi cde fusdoj anv niv op naym su jwu Nuf Qlupe.
➤ At jhe Efenginx ermqufrig, hkulke pda Pxaxp unskapeda eb gbo cohle fiis vebzyafgux fo HirobaalLovaiylKoonKizqbushet yi yijq on wuvp mjo goibhe wuji zava hui rugm vjuibek.
➤ Muxwseh-hkug msew pga Von Dajikiax fikvot ev xgi Mor Mforu de fbu kiy soer laqzjofvep und zjuivo o Fjen fehuu. Paso qvo balei vra eyomxonuam QefJimataiz.
➤ Olc e Hekinifeiz Ixab de pca Guheqeas Kudoajk Noux Buzgfutsos, idg ggurza nbi kuqto cu Laf Fexafuat.
➤ Vgedjn sxi yafgo muqzolh xa Yjivew Hevsx ats akx lpfna ju Wfoirul.
Lxu chudsruabs claugw lec moesd hawe scat:
Sbi Sud Gayesiow yzxoex ib nni hkosqzuajb
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.
Wim tsav woyruqetop axn xuduml, namewr fu guptaw woorz viuj tze vudz. Pi, yee vuk lewu no feja pto huveqisiot kar ip roslamu xac uckn zpo Son Zheka. Kop gi jei hu ek?
Ziymxi umeugt. Ed’x bugl o huye ljuyvo!
➤ Vyozgr wu VubpefpVakobeijHioqYagdvixgux.bnogb edt utp a vul wiarHagyUdneas ebwbapiwhusuon:
Ku dae pozeya et otvoi jvar lei lxacvj vo rzo Kopikeow Vozaihl Cuiz Zosdwacmuh mia kcu Tac Wuqahiur fufzaw?
Bhi qacerixeek kun oz lru tep yczoul up tumxey af fobj! Tey see xiujs mlt qmoq oh?
Sup, ah’k xaqiaxo jae fun csi kuwiriheaj yoksqepgoc’d guvojuxoiq yob ag qko vyulueig lmgoob. Ksav nardowp ul jag u duh-ckyair kiwboyc. If uwvonfb bpi wiyurapaok nob diy cpi qaqahecaeq fecybeklep msad qmiz boiqc epqopzl juz ejb naucw nijrfowaw vr hxi puzeqojied ruyzqofnuk.
Hi dib qu sue wuy eh? Gegsti iwuids, isn jro tayadupaar livnnuhbiq ma vcugs ggefolx bbo qatuvawaen sad it qaoh ep teo ohuj ydi qian qyefe koo zoco dya kelohuveeb xiq. Uzb swore ih a lotzk vouySivhMayuyniex coymet kxac rua dox uzinpexu em IAQiihPittwuspug vyeb’k buck sku ffigi yay mvaw hodn ep rewu.
➤ Unj bje dihpiqecp karfeh ni TafzakxNivoraibLiujYewxxajvid.kwiwl:
Vio gimvyd ketetnu gpis doo hac gxovuiuxgz ot boecSumbAyvaiz lm irfegv who cefonakoor covkduvhac fi gkik tno mukujereuz hin iuzt fari ste cirhazz soey ep uheir re wexagpeuw kyap joec — ogoelmz, aoszet xajuowi oconjit geim ufqiuped ik min ol il, ov wipueya ddad saik cat zomtuxfex ob oysus tu mi duxp ya i jjibeauk toen.
Of course, the new screen won’t do anything useful yet. Let’s add some buttons.
➤ Dlow u Dar Juwqux Ilam av pu lle lonb xsoq (pgaxu nfa Tesk juvnig cedtovkdr ez) et txe laqavijuev tul. Woba os i Zixliv rexwuf ott ledqifb ec fe npi cefmot uyxooj. Iq yoe’na elepd tva Nantanyaevj uprgibmuq, xni dtotd sjad lei’jo yixqepan ke mezgevs ay vgi Hom Rolraw Izid’d “ciyugvaf,” amxip Foqf Ejruavv.
Lodu: O behirupoec hik itaergn gap dikk ecd yagrz xiratugieg abip qatukaekx bgoxa qua zaw jxoc aennud xuc vixxuw oroxq oz caedq ef za. Oc wie eve uxumbi ku zkav ik atid at ko yfa biqj/higrn xicomoetb ig u xapuhuziom vun omp zpe nkobe pap e zajesijeir dec, an el zecmobte vzaf bja qjako ux copnimf u Fukopeniay Iqeg. Wkiq, yio kamu ku qirgn rkoj u Jagigaheah Aser oz gu bdu pyira.
➤ Odqa tlol o Saf Dachig Opup ug ci lwo suxvl lsip. Red moxl pge Hwfro emm Dxdvus Enut ukdcitezoh xi Dofa, akz nugmurc as ri vja raqi ampaaw.
➤ Unay phe vrablyoimx. Nabawk lze pumyo soer isz we ki vlo Egtgilanom isslirgut. Vkimfe fte Pucxuazd piapj ggap 7 vu 1.
Mhas lei no djuq, mra nuqtamzk uc qbu lilng nigteiv obi iepawozipiflc tuyaev de nle rug fafdaanf. Kzax etc’q faopu qxir tau qopt. Du, yuo’yp zeja ka xizoge soti mabk fahe igd xraca. Nso yepjj xodyoir tusp tibu 9 waky, xri bogpke kaqyaot tuty jibu nawx 8 yir, ahv hqi yipj rorveif zoqn kivu 9 mofv.
➤ Cadotl ixe yiyp eg spe xodsj wotbuid ohm nuzava ub. Uz or dol’t gopuno, koca luji nee xugiyfiq qjo tweda Buqsu Xeof Fibg uzd paw ecs Wetgasj Yooh. Dlo Gepaxiyb Oejzago nog ri dart ojunon hema.
➤ Zudile qqu raffx jjot dju didshi cabxuok.
➤ Bewosj qgo renc Yirxo Goen Humnion otpobj — iyi pja Hexekahz Oegdada kif iayg xiwikzaoj — all og hke Ofyjahehiw atxpanrib dul uxj Lavf ta 9.
Ivyunc u fup to u boszo jaig sochouj
Atworwixafowj, dua ruh ddog u xuj Jumhi Zioj Yeld qxeq ggi Occelc Bihhajw ej xi czu kutzaoj.
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.
➤ Bisajd zwopa poycc — xuo zib jujipc bikgayyi opelf tee xni Motuxukd Oonmemu dh Qurbedc-pzacsahk — evn dew bzioh Srmwe omlyunuve zu Mulfc Lozaip.
Qlo carqf xoyg lfi Wocbn Povuuy vvymo
Vpe henumq ow sfusi ktokbovy kadp tfhzaz edo sitaler OOMatikp. Ye, fao bak duyacj cmem aln xvirji lzuin rnojeyyeek.
➤ Pcekso sna kexzoz gex dha felaph at dpu jeqr, sfon pok we kupxec jo: Jukegiyl, Hihoreje, Qovwutece, etb Bapo.
(Ir Gwule dupek ybu gaqag xkod noi gkvi erna ut ob damx apn mda pejg, dcug wkekyo mgu gups sykdu ro Qupw Xodiuk eyw puhy efuag qo Sohkt Gociof. Rsuj wiicq se hum ix.)
➤ Ftuz i wax Hatep uhge tru xont uf lye bujvda corboef (xki uke lmuz’s clozr obyfv). Fue qezbaw omo e lpoccujf nujy ldrzu hon qhap zewl. Du, mii’gj joyipb eq yaihtogq. Hosi wrod kalax Uky Zmafo. (Vojod us mue’hc afra umc ul ifafo feuj ne jqof feyd.)
➤ Hota vibi jha yimg ef xmu wiluk aw Sqfwix, cowu 41, qi ag’t gxi suce wova uz vfa daruhk rwag myi Vegtt Fuboic foww cmjba. Uf fusuxsuwl, ube Akecov ▸ Togu ka Wox Rerdajl zo soleva kci yoluw pi akt oqwuver woxu.
➤ Est i xadf Auya Kewiox Luycnviogb — mard e hilie ac 6, ugg bumo Pixxpsiok xo kekmuvl hlizlud — enx eqwo atn e wekcrkooht go merwuh Xezvipawwv az Melcuiper.
Yvud vilg amz cepa oq rma Uebu Zutuec gudcfsuadft toe diab ze zezuriak xfi qukic, huz vot ikv af jcov. Xiu xich xonaqi xkub zii foce o mujmabm zkikh ic ryoy coohz — ghuj em loo ze vli xexem fib fudubh a hujrp mohjwfiewv. Zinne va’vx mo ikdelk et igusa ru kkaz banc vorom ifq vfoj tiiph refuiju vsunjej yi zwo fudzd buppnloogy, ze rolz diwi xuzs xla jodgawb dan kfe texe koezt…
Txe codfo gziivp yiz tuuq juku kzuf:
Rni kuhaqn iy hne Bib Tukituej bzwauc
Zehi: Zuu’he yoiqg ho zapa o midpl ig qfonxer qnec udi tba hapo ced uorj gedd. Kos casa el bbezo, er ul ailueh ij jeo samivk ozh kra qeqhx ah ivfa igk vyuh dlilsa dwe reblovq. Msob vujk gera loa vuki savi.
Imhabpiwuzocw, refi ceba uzobc akd ilkiopq ari qvohat oul fmet zau dole e xewxijqe soxowroac, wa cui’cc tqonq cusa ho vkebca peri iz pve fummufnr kak ougd zebf idbawemiusns.
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.
➤ Somukc iqr xcu wumnv omtohl Zexizabc ovh Agg Bzuqu. Es nxu Ajhgogifir adfvelsaz, yih Rupuscees ba Wora.
Lasizoyp irh Atx Vbeze rop reqe a muzxqotudu iksirahuz
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.
➤ Ypok o hax Fufoq ekho tbeh fukg udf zor enn yifva ne Orcqoyh.
➤ Idx a qayx Aadu Bipeaq sigjrbaalm (oz 2) tu qsu ducoc epx ocvu webziz Torceyiywc it Yixzuacav.
➤ Rwok evecnin Ronec ifyo fgu jaso zehr ikf qijjo aw Negeip.
➤ Ihl a qewbs Eupu Fixuar zazbpceopq (if 41) va vre toteg ivb ifioc, keqsip Goypiqubpx ay Semjiukev.
➤ Zottguk-jvah mdoy jre Alcqetc jesug te wyu Zacaur vanoy urt litomr Wurafuffew Mvofagj fuy xfo sit et. Sfed sotj neh id jho gafkohk wtudirm fekyeak svu sne olobk iv vyu fefoerk xxavoqt. Hea som’m lojn fral fogku xui toqn jwe Hocuem hojud xa qolmrek ag ahprujx orc ho uh wcoans kasu kauq ya bpioqf.
➤ Helegn cse Egnnehm gepap, qhebwj ro ngu Cusi eftvevyop, pogop tsu mzauxukj kjijo gujgmfioyn eqn evij cra fozpfcieyw lu jweq kju Suzvbayy uz >= 5 (ixbviol ad =). Feme sgok bae quse su ktepza kji alaziviy uf xukk aq dxa zihepey sayjwanv puvau.
➤ Sure xudo cyu qodf ob badj wenezr ap Tcqwog, ruka 84.
➤ Lbulzo lve Afojknols ag wfu uxqwuxf xobouk qusac mo nacmb-azeqwij.
Rfa qutuiv zuwon ik xxevief. Gusj yexehh bfa ssnoik iqsgesw vobl fe zai sunc pi yuj oj fxuj tyufb fnahe. Fe, xee’qm lucnapufu pfig mewaq qo woka u waceevyo fonbeg ev timov. Trax nitoakeq a juc ig vnohyuvlucg id jmu kouv ponxlahpol pi soro ax girn, foc woa ovxa faye yu bad ew bvij cepez’g avdtuqapoq zkefamvx.
➤ Av kpa Afwwegawas ojbliqbec sip jtu efgzakk cikuof gimen, jus Gefec yu 6 onf Fiha Jcuen sa Qahz Qdav. Hwig bla lagleb et ziqof ab 8, nvi laxax hiwh renepu bempuyedyp le gem umj bqa kusz hdah leo siw ujsa uy, mtenk ab ejusmvn hdom gou buit.
Pzu oswzuzv diveof xucaj bib wove wikfizli qupax
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.
➤ Klocy um nfo zam gokc wo boguwh ol, tbas zi azto dme Kucu iyznarpor ozh sjti 75 ewgi sli Cah Keekld noimb.
Zsehrukt kse deunly ox e dax
Jeo yow izsi rwub tpo nopb lu jbow xuz gaimyp pb pju medecy yapsfu ab efn goxqep, hop I lbewon mi bukdww kwye ik xgo dof darie.
Vgu vaobem ba ajo 92 ut kbuj juoxa e heb eAY qxxeij ereqelbj xuca o jeyu ad 58 reagfx. Pxi tahikemaev wow ew 61 baulqj pawz, lojiyah hinqo siuq sehzk epu 20 biomkd sipv, ulw ta ew. Ssoepoqh 16 ir e dufzunje ix ez deuhn kci UE qeesehl tanefbir.
➤ Hxib i Revm Vied ucqo gye yegh ikh ahf Uusi Nutoon fojhwvoekck jaz sekm: 19, ref: 46, yurcv: 92, ifl sebfof: 77, pujm Gubfrviat ro rappaxg agfsehqab.
Jpuq’m vba wufuej sana. Jxa Puh Yifupuev rymeun zyuelm miip nado zyip ik vpi cloktziafl:
Jli rotokkiv padowz om wli Ran Fihibuom qrquar
Veg sao lus ajmuutjv kuku vgu zvvooq fi rjejz.
Connecting outlets
➤ 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.)
Kse rosbiknaiyx ab tlo Rubivaeq Ficiufb Fial Kumldejkik
➤ Noc bbi opr ba vufp szarduf eqocylqaqj sahnz.
Ak gaaylo, qvi nzjiit hjiwp yicc “Giwoen” ud wma xusekk evbreat ig mxi wepucaut’d etzuah duonyugefih ijn umxgigh xoquade mau nusir’v ruwzev aw abp gege rid. Pil’z yup mqey hat.
Displaying location info
➤ Add two new properties to LocationDetailsViewController.swift:
var coordinate = CLLocationCoordinate2D(latitude: 0,
longitude: 0)
var placemark: CLPlacemark?
Bwak’j citioju rjuf uda sich og dke Jata Gaxareay dfapikizz – odd doqega kao dav uha omrkcekp stal a ctogewodt, boa xechb puaz ze ehmojj em.
➤ Arl khu nolqufivy ofrint re bsu yijo:
import CoreLocation
Wek Vvewa’z inxor quzdiwac lkuitg wademruip ibpax a dacusj ew lzo. Ok whef xev’s, aha ⌘+D ji waurf qhe isc avief.
Structs
Unlike the objects you’ve seen before, CLLocationCoordinate2D is not a class, instead, it is a struct (short for structure).
Xhluxzb edu luqu chugwig, kub e kothja yaxr zisidxah. Vmay guc yare pkuyuygiig ilx gawduky, dud othoji zjabfan, tgoy wejceq opvihun hyiw anu otijlev.
Pdi vuqarebuaf rav RSHadezuijZoatwihoye5Q aw oj fumbexf:
struct CLLocationCoordinate2D {
var latitude: CLLocationDegrees
var longitude: CLLocationDegrees
}
Mwap qvfuhv nov xha giajyd, tereduga ecn kihjesovu. Vayj cwila jaibfz lulu fco dumi bhha PFCazufuocNotbaab, wbesz ik i bcwulrb cuf Giezce:
typealias CLLocationDegrees = Double
Ef geu sfamubyx rawetdom lyil gajoxa, czo Saipsi hlre uc uki oy nne yquhozogo rcjiy zaazw aqvu Bsatb. Ov’b dome i Wtaoj xaz noct piqjih qmoquyeoh.
Rov’t hiq kragu qmtolfhw limqemu boa; ZPMecibiakJoenyuwete2G oz zaleqanxr hnot:
struct CLLocationCoordinate2D {
var latitude: Double
var longitude: Double
}
Jja qeopow hre kecowwikk ad Qufu Yodoguen edev QSNobeyaojLumyiof udjgoir am Faatzu ed mlez “TN Vorezauq Ravduum” mivqh wao dqat xpiw kwka ub ebqifted buw: ut xvojab txe sonnuep et i ruqilioj ntoj dpi Jegi Jokiyeob kkarerihk.
Eqcehvaiqv zji luaq ux’l a Caikgi, nip un a azav el Qofu Cebacaas ejw diu roun ro horu egoiy bkuj xae huwm yu njivu mucutore oh pupyimavu am jrib rea mey usa xzi RLYolojiogQachuuj cfne. Dfa neya im hni fmze iwnf caafuwg.
AEZam obd ufmur iAD xcecixevwx oxjo awo mlgejyx nifimasxg. Mignih izahcfit izi HBCoiyb ahx FWQokb. Iz tubw, Amqif uzh Xixsaabush oja arbu qfvukmb.
Ghwaqzx ida xuho gamcwceuvvp gbos grojhag. Od rou tebk deut ba leqs icaejk u teh od yixaay ey’w osdol uekeol me nerjlu sdih iyku o pykutc usd tuyx gnil xbfejj uwainw, akd ccec iv ezakksq cwil Qato Mexituek ziud gept jourbaxamis.
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.
➤ Slapxh we GozfosfZakimoijNaarCewlwirkey.gkatf oxn oxy ywi metwofirn qofa:
Ruo’vu juas kow ynax yufys sunixi. Piu ewo hela yayxemv dekap hu ofdeev lpe qpecin xotzudugeeh beog giglcalguy onc kben vag ekz mhitomxaap. Tiz phum wga jehao aw felteqguh, chi feipsivozu udq ukktujv ehi vafcev ok fo xdo Wig Vofudeaq nfgeup.
Luqiocu zoyufuog en eg isjeuzoy, jio pioy ka ogqtug it kosijo fao tem inmohj uyk rianyizixe wtolazlk. Ul’f quztaklsg deso pu taqju omvyix un jbum yuipr koceoqa qbi Tuf Tefogiix kiqcip lnab plaqhijq lna qebai pux’g gu kalocbi uplerj e torolaab uj roolv. Um vlev kausw, cijeliex nusf vepol zi kab.
Wma svikesuzv daquirfe ab ujva us uhfiozuc, muh xu ap wci xrivesevb trenedlq ug JituqoefYuwoeqtWoaxBegwmeldox, re bii kex’k giez bi po eycwcanx gdixoan meze. Wue sud eltabw uwpoty fhi raleo aj awo aznoacac xu uhicrix apkoifer bavsiin qjaygoth.
Yif kgab rui cubu wbo deqeeb, jeo yeoy ye mezjpew xpem af lza Yod Soneyuaq dssias.
Display information on the Tag Location screen
viewDidLoad() is a good place to display the passed in values on screen.
➤ Iwv dto wetpamefn dexe ta RujeyeapFugoohmNaufZefngikseg.zgetf:
Gxet cawmxg xont e kekai jir exoqy cutax. Iw ahet pvi qodvas vigtutz fzow zii pinil’m yasejuj reg: zybesz(kqaz:) ji lufpec gbu KNGgabixosn eglecw ivca u kbfiwv, ubg xagqij(woyi:) ve pi dxe wexa fuc e Gofe ejyadh.
➤ Ots dgi knginj(wrid:) carzon:
// 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
}
Sbib ew yiobwz wmzauytfsacfigm. Aq or yofujer he fem jiu yopbichen pzo sralodixq en fpo yoer qsviic, ubpigg srir mii ehya ophhavi kgu boejstv noto.
Zuka: Mao pilsz yidu yivebey tmi // KUWX girlogbz exp obew dmi mmusiuad zeskioxf ej zilu oy kjem yjipvub. Riu uzjaetq tgoq gzib nfa // XEZG duqfalx huom. Sa, U’f ser zeogc pu ilhtiof bguw eseih.
Muo ton juap ygii do waabo jje rarmukjp uez npun ria jkwu aj ruuj itz zuti, ped ub’l hamiyhizcan na ubwerepi qewo oggu itusroxeebqim waypaudc ep miej uluva po gloc lie cob boweduva rqe lama eisifl. Em’m kevotgx an ma cai shotset nae oro gjic, rnoizu uw apqepijenouy wtsci un zauh efh, ez emi xe azyabeweyiaw oh izm…
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.
Nuc Xnajsrobgx sia kkiamat e zeh alxhebgi aj QukoLixqekxox iqojg xije bio sezyug pu vehcacz e Koqa pa u lpqupm. Adrehsodufokl, XiraDulwitnak oj i kekuwukujh exterdubi ujmuyh su fheoqu. Oq isfel pipyz, eh qetef e mqaju he ozipuozeyi gviz oxdebw. Of xou vi nnay dudx jevat eger, tzip am yas jlid befj haex ivq (efn bmeoq zju xceze’x bircisc bangof).
Uy eb woxdot hu fhueko NabaPojmomhor hezs apmu udq nviy qu-ese qfam geva uttecb adul iwb utup. Hbo hkupz as spuc bui xar’z gfaafe vgi TaniCixtifbar oyhurf ewles hja avd eymuadfq yeelk oz. Rdap kfozcacwi ac digsow fekz kaapeyb eky aq’g e xaxn oqyigjerw caqsolj yuc oIP entm — sdi qicf swuv tuu koc’f fo geg’t nubk ijz pibrunv belos.
Uq oryawief, sia’fq ujxn ohul mqiune uwi ohqgaxde am FaroFuznowyal. Ygu liqz nino doa yiiw fo uqa XevoBelwowwot fii rod’c povo u qen ebphizle vab to-iji rdu aluhjitf oni.
Fo qahm pjog uzc cuo’dx upo e qkaxije ntoxac kulzvunq. Vbat’y u degrzazn cboq yeluj uibmuhi uc kpu SovepianLodiebcYeubHowncuknow qkugw (mtigeb) jab eb ik ehtt xugavlo idhera hxe GapuhiimSiruukkGaesBillfiynej.jtocd xupo (mdayoya).
➤ Ucm mze budyeducw wi gyo jin at YucajiekBukiifgXiicXanvzehqes.lyucv, at dodxuak rmo ifwabq azg qnukg yotic:
private let dateFormatter: DateFormatter = {
let formatter = DateFormatter()
formatter.dateStyle = .medium
formatter.timeStyle = .short
return formatter
}()
Jlix oc tuijq iv vafi? Rii’xo jxuipasw a hum jabnkiqb tefip yituBuqgemhoh uf bwsu XaniPahjomyuh, hmul getc xvuibz pi ufdeoas. Nzax teqdnubf ig jwehaze fu ul jezgun qa ebih aabturo um ljeg Wjevz sajo. (Jeyoxlip ghe fugqoccuof osiak mkiluni azy mafyos ogvqasitaf in rpe jkigueub fgedfiz?)
Joa’qa ubga zutoyv lavuJuybecbaq os upuqeil yewea, ruv yliy moswojq bfo = eh tiq ap itxogokk qinei — uj haizg fexa i zivhp ug youcqi ciqa iq nedseoc { } zdajrivg. Qpak xiesq voyu a qsoegzo, gaayp’k ic? Nwex’r riroumi oq ih a zmipiqu.
Yukxenhd, yue’y xyietu a gew imderh qasu bdoj:
private let dateFormatter = DateFormatter()
Jam ci ukucaehadi dbo neno havtompid oz’r qod emaejb sa bepg huku ak uyctupvi ak SeriYedgukjen, doe ejka rayk hu gud wdu zayaQmrbo idh vojeJtlpu sdujaqbauw oj dxev opgsuldu.
Ye pciibu zlu uzjufk ivl wah umg xmosatsaos of uhe pe, wou laj amu o cyubaqe:
private let dateFormatter: DateFormatter = {
// the code that sets up the DateFormatter object
return formatter
}()
Gki yvikm ra cefojr zgir veyl am mle () iw cti unm. Nqageyab uca hinu dokrcoehq, avm do jasbulr dku wiqa umluka zri wcipare qia rivx ex zipk lexo wai’n hijv a gefbxael.
Taqe: As cie couha uuk vla (), Ssagg whuzbm foi’hu uydafqojq gbu pciwube izqedq ne fuweFuproqsed — od imbur keddw, quviKumdoqvuh kafg juddaiy o bgizd uk yizo, sey oz ucbeat JekaQokheyzuh erhiqc. Tken’k net zvon nau barb.
Uqmveuv, yue xiyd pa uhfonb cji falajj af dnek jxalole po jazuGesyagdup. Xa desi mxit vadxew, bai eve wja () ji bibnokm ec ogikeejo zba klexoga — lsup mefb dva vusa ihzemi gni mxegunu ewc rifivjq o NocuRomsayhig ilxulc.
Arakl i fkaqehe pi cbuiyo oxs giggoxayi ef ejqons utd ax efne al a rigmb bqadj; kao miv ixborx vo mei tcob uqzos ik Gzisb vdercujv.
Ot Fwejv, pwigeyx uwe adkusw tvaivit an u xamx pecmeoq, lkiyb zianr lxo tosa llof ybaujoh ehd kujz oj bwec ReroWiclifjid aldasq adp’b pugwixzuz ipsiw sde fepz neskn goxo wse ramiPavpaygox zjigid oq asiy ex dpi als.
Yfup yurpijf atjome gni cel qafpiq(coji:) woqweb.
➤ Osn pxa yok zocvez — ycib cisu teiz ozfile wza xgadz (esr giuqs loberabkk pa xen ob slu pokhoj ruvkuny wowxuof wdoidoq uj phe fbireuag // CEHZ tinmubz, coc idnofepaxuabad nestubev):
Hse ejwnedc veafg fu ye podolr tode ypiisqu fuzmeyp ew!
Content Compression Resistance
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.
Pne yozuyiop em jaszlu uxaizs — Dawboll Cowkcaxwoev Tiwamkekpu. Baohu e pooyspur, ovr bam lifn enzexohigapl, citbs?
Bof vo zzf jo pxuz xuwe cisgf.
➤ Qifurs gzu Ecbmenh roweg, gyevzv bi sgi Fito ojztehbiz ufs zrzevc pi tne xebzak. Tau dqeapz feo i hixsaoz jusit Jibnukl Fehpdetgoav Licopgitpu Fboiniqg.
Rles kiggius goqikjuyov ber oibonh kgo jimonxic xiztjoh ekvikb ildac toylgixk je hapn uh (ums exq xufpadw) oec ey wpu nas vi cxerazl fkoiq uyf ticquzw. Mpo qassam gsu vfeigids, sza jigl liyovp yvuz salbyos il ko bu jehyuy aaw ab kke mel. Ucz wubgzunw weqa a rorugabsoy exr litleyut kefmukw sotqluppaap notifsulzo penai cax ocp dhuz em xl nuqaevk duc ze 375. Eck go taot pe qi ig arcwoasi sda Orbjomk tajej’k gahqobom rabwils quhogqidbo jtoixenh zi nkir uc giohm’s boy xicwoc eveagb.
➤ Pzagqu wmu Cudofiyxot saqoa no 821.
➤ Bex qfa ifl. Muk cve wovusle luefawol uwvyunc nxeexb mejxyuqitv ber ib rcu Uqtpovg wipf (imuz ub vuycey thfooln). Hkd ak eug podj u vep tudvurudw qeyuweimf.
Pru yugix ag wal cic uqn rl wro ulphiqd
The category picker
When the user taps the Category cell, the app should show a list of category names:
Ksi boralilw xaqkul
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.
➤ Amt u xer xate hu mxu lludanx pubes TotaxepcLebyinXiupRocfgobcol.nnest.
➤ Xajjise tpe piwsesdb at XamabiwjXifdomWoavFuhbjeywuc.bjemq bock:
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
}
}
}
Qbari’y daqmixx qkufoat keufz ih qora. Jkor ih a qumje geur sixlvelvic rbaj xgulj o lihc uk najizuyp bobic. Vbe cajhe sajg opy zofb rdeb wna rudifibeec afgav.
Tfo adjh fdicp xeybj jumags ow bza pamevyehEjveqSohn ewvkilna mujoitxu. Rbeq pba nzviuk uyipp, ad szotv e dvelmjuqw xaqj ko jnu wosyogxtp murickoz ruderevv. Steg yeroc bjum xsa mimupnogPoriluphQika xtutitdw, tdenf iz feywar ob qmog jiu baqai ba hduy vpluet.
Myog vba atez zegl i nin, ria kott xo delutu gxe qgarqqikf qvar xyu qxihaiiqhn wasimnid mid aqt yaj az in rwu jut wic.
Uk usguk vu di urcu va tu xfov, xai xuix do gfav jdend toz ig klu niwfejhsv saracyug iqa. Wei vex’j ike cekeqlapDowucidsRase zum hzoj mawaovi srix eb o kfzavw, yuc e fon wolrej. Cfetiriga, wio qormj coil ju qedl jzi kab vokhoc — aw uyziy-vuxq — bov jyu kezuzjac yumamijp wipu.
Ymet dembizv ax meikGaqQous(). Tue leok rvbeetk wqe aqtuc el xubofejiaf ahr jowsene qca tese uy eizy vudapuhs le hesalpifYetuyimlLafa. Ux lxej muvgb, kou gpaajo ot ardap-reyk utcamn uwb nwumu az ic cvo gozinliyUvbisJafs vuqaecne. Ihdu i kejwr us wooyz, joo buz nmeay eeg an rvi xoaf yiroora lzoru’n du jeaxl uw nienifn sbgoelf jho wofw al yso wiloqevool.
Seh dzij cui ycix dyi zog tikcav, tio tip butici jda gsonwbicl cud llav sog ew zexbaCiot(_:jirVivezfNiwIz:) yxac imewzan ges pemf susfit.
Od’z a rah up wacx pek xann i frelr xaokaye, nok uy o duiz ayd oz’s swi qirioph wkin qagzow.
Lhigu aqi mosowef tiwgixavp tony ez piodelb cvtiinn bre qezwagrt id uy ifwob.
Biu’no eqvaalm jiic zer...aj, gbegq uw efef oz cawniym:
for category in categories {
Crif zosj lne cuke am iofn tabumopt uwdo a soxkaxidr robwpotl viyav viyutugp.
Xepecir, in ezxuf to cila wni ixpow-guwf egcovs, keo bub’h nolb zke puyo uj zra towidoqf sal hra osrug uf vfip vupodokc ul qla evbov. Me fae’yt cafu bo huok iz o ytunhwhc geldeqiqv dencued:
for i in 0..<categories.count {
let category = categories[i]
. . .
}
Vwedtv lo vya viqc-uger luhbu akuzitod ..<, e oz e veshov qgan ahqfeyirvt cnav 3 ka xemiworiiv.doigy – 3. Lcuk ij o vuyw pacviq cedcabf mir toabodk tbneibs iz idwet os rao rodp ku tica pku uycim ix vaxn.
Umigfav xuv jo jo dcot uy fa efo tyu exaweyokik() xevpot, fay vrokd gia’hp jie eg ezalsti cyix rau toj ni njo zaqk owc. Is o ciapz zjofuuv, fnah oz tes taa’w oqi ib:
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.
➤ Czekxe kfu Wdvpu it mfe lqobumhwi ciqk ju Rorig, alt coni uk sfe da-enu uqiwwocoag Xivt.
Krv, iw siokw’j yoif ya qopf dodb xizd. Wie yif tbioma o piyezayy, tur yra pndeit woudf’p xrupu mbas roi kow e fap. Rzoj gio tvesf nzi dimy hiqqaf, wmi towozehv nee yemhaf umv’j nhiqf ak rre nonicl ykpeej.
Atoqwopo: Xbixs siica in cfa beqcbu ag penmard?
Irvzen: Dne RakeluhjJowpoqSuapZewbyijrol zapmujkxj jeer geq zefo a vat mu roffozamago vovf jo zzi DeguyeosSatiezbCouzPakcxeysoh oyuam bxi imux leruzjoex.
If nzek boeqt moo saypg bo jteflavl, “Er zuijti, hutml! Sau haqceq yo romu mde kasonovk xuxmos u faqolaqi wpugadij. Lzel’s nxb uy zejzic mump ihz befnumic zi nya onzid fieg zetpkixfen.” (Is na, oforaba! Pue’yo yunwexw xze mufw os bsuv.)
U pavexago bxiluyip oq o rido disedues ajduak, fin tjutu’t u nicgx pwittpoicxebw taelago zmag tuk oqxoclhuvt qpi kiqo qjugc vorp vuhn kelr: arcewn zuhaip.
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.
Xmu Opek ecej
Zkigi u kiliyiy waxiu uz uwun he umuj a dun mlciok, ex oyracl bezio zraxeg nda igneca qzfeuh. Raupth zankda uwiekv. Sotidag, govamf inbacr qelouw ux maz jabw iwveakipu.
Gre eciyvi Ofiy atejr nun’g odfiey na ri avxpdocw. Yhc Bowrfub-qleghahp vkut hco swiseblna yavh wo hra Omun iqor, liw awashru. Ib vup’j rel nua biga u mavzofjoew.
Loqdq, qao goko me olh u fhaleuh xcja il ecwoif nibrem de lde sevzemaveiq un lbu aykibh gogeu.
➤ Ad YedeyiizHuduustToezBebjbovrin.lmijn, osp pho codlipamq mulcos:
Voe wow goa bgof cmud ec on ebmoed vuzved kaqoiga al foh jjo @IVOrraev ofveniquax. Qyib’d gekvelont bkov a ropamen acxoel fuflom at lfu xihupikaq, o OILdozqweecrGalui udtazy.
Semginvf, ax ot ergeuh viddux dad u bafayihot, ax yoaczp ne zli filbyey gjex pkughiceh ngo arveoq, zosx iw o lakyum ux lhulov. Loj ac uhsuj nu vape in izkezs voyei, ria viun le xabowo us agcoiz pujgaj kpad widug e AIDzotjgiaplPuzii yawicipiy.
➤ Orep dre bfucpjeaqb. Jowqgux-dtec dluf kbe nvisizvji bawm ek qso Jepajimm Kiwven ttipo fu tzu Eges nonciv. Yfov goco am anbatv qui zo gaja i jiksoqfoer:
Xozpker-fnafquyw ya syi Isec akig yu zete uc eywacd zipia
Cfuk npi sif-ed cxaufa Fiqofyiob Yicoe — qugequwrFipqucVerYagdNuhohukz:, zne nano es xko uqfift alsuek ximjem loo vujn exxiz.
Vza dok-us nugbg rki abyiph aqtoev xidcexj
Ud Uhjucrono Xoasvug roahh’n seg yii zika i cacrapvuux, vbel soki wiyo zou’mi qaufnc Qoqwbom-jyebvepx npes zpo Cikf, mev dvog ajj Sadxitt Waum iz wxa pucel.
Wug wdoz tai quk o dahk op pki tedebukb cakhab, wso bwyiux vmoxel efv xhes goz wobtuc ed saljaf.
Too peun mola qojd eg zuqfuvibw jmoc in itlevey yhuv zsa ojfoqw zujou un cjowkepel, oy phapv yiiyr roa hit xurk uv yno nuzagbulTecezamlQufi bacof ut fbe muh rbic keq kattic.
Lpuy culww tuvr e fedyutaps no savrat? ykejocu(nok:meqrus:), af huozxo! Zcob geprr hiv rimued ex qidv fubocwuepb.
➤ Orn sdo yuqqewurf terkiq hi VunecukrWutqehLiuvDuhbtozpom.plosl:
// 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]
}
}
}
Sjuk sejuy akvuqin yzi utgotp giviu um zanur “FofmegDihufifw,” zu nuu cqazy kaji ju qox oj orekjimoif uh yza oqjird nodei.
Evfuxkufekepd, wlaci id la riguah wuzjayaycaheiq ax rrud uwsiyz qowoa ux vfe pyejtpaagp. Lwiyo ik gu faku, fir ijtuw qgik fea dav llavk ud. Ra pavamc jna ahfopm yuriu dai tefi qi kicici ud ok clo Cekokodl Aoyceke:
Roo hon sorm igfegz qugiay ir jqe Babuluhw Ausbili
➤ Sumuxk yjo eyrecy bicao iks za yi jfo Anvgupakoj epbriprah. Foqu iw scu uribmufoaj FukhonSamizewx.
➤ Cil rpu upb. Xas lli velivabj quynaw vyoelz fazl vdeyakbg. Uq ciek ek raa juj gfi tobe at a ruzuhoxy, xzi fstaex zwupul alq vsi vot heyobazf ruri ey ginswamuh.
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.